1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue>
using namespace std ; const int maxn = 2000006 ; typedef long long LL ; struct L { LL val , maxa , maxb , add , mina ; } t[maxn] ; LL a[maxn>>2] ;
void build ( int p , int l , int r ) { t[p].mina = 0x7fffffff ; if ( l == r ) { t[p].maxa = t[p].maxb = t[p].val = a[l] ; return ; } int mid = ( l + r ) >> 1 ; build ( p << 1 , l , mid ) ; build ( p << 1 | 1 , mid + 1 , r ) ; t[p].maxa = max ( t[p<<1].maxa , t[p<<1|1].maxa ) ; t[p].maxb = max ( t[p<<1].maxb , t[p<<1|1].maxb ) ; t[p].val = t[p<<1].val + t[p<<1|1].val ; }
void spread ( int p , int l , int r ) { int mid = ( l + r ) >> 1 ; t[p<<1].val = min ( t[p].mina , ( t[p<<1].val + t[p].add * ( mid - l + 1 ) ) ) ; t[p<<1|1].val = min ( t[p].mina , ( t[p<<1|1].val + t[p].add * ( r - mid ) ) ) ; t[p<<1].maxa = max ( t[p<<1].maxa + t[p].add , t[p].mina == 0x7fffffff ? 0 : t[p].mina ) ; t[p<<1|1].maxa = max ( t[p<<1|1].maxa + t[p].add , t[p].mina == 0x7fffffff ? 0 : t[p].mina ) ; t[p<<1].maxb = max( t[p<<1].maxb , t[p<<1].maxa ) ; t[p<<1|1].maxb = max ( t[p<<1|1].maxb , t[p<<1|1].maxa ) ; t[p<<1].add += t[p].add ; t[p<<1|1].add += t[p].add ; t[p<<1].mina = min ( t[p<<1].mina , t[p].mina ) ; t[p<<1|1].mina = min ( t[p<<1|1].mina , t[p].mina ) ; t[p].mina = 0x7fffffff ; t[p].add = 0 ; }
void change1 ( int p , int l , int r , int x , int y , LL z ) { if ( x <= l && r <= y ) { t[p].maxa += z ; t[p].maxb = max ( t[p].maxb , t[p].maxa ) ; t[p].val = ( t[p].val + z * ( r - l + 1 ) ) ; t[p].add += z ; } int mid = ( l + r ) >> 1 ; spread ( p , l , r ) ; if ( x <= mid ) change1 ( p << 1 , l , mid , x , y , z ) ; if ( y > mid ) change1 ( p << 1 | 1 , mid + 1 , r , x , y , z ) ; t[p].val = ( t[p<<1].val + t[p<<1|1].val ) ; t[p].maxa = max ( t[p<<1].maxa , t[p<<1|1].maxa ) ; t[p].maxb = max ( t[p<<1].maxb , t[p<<1|1].maxb ) ; }
void change2 ( int p , int l , int r , int x , int y , LL z ) { if ( x <= l && r <= y ) { t[p].val = min ( t[p].val , z * ( r - l + 1 ) ) ; t[p].maxa = min ( z , t[p].maxa ) ; t[p].mina = z ; t[p].maxb = max ( t[p].maxb , t[p].maxa ) ; } int mid = ( l + r ) >> 1 ; spread ( p , l , r ) ; if ( x <= mid ) change2 ( p << 1 , l , mid , x , y , z ) ; if ( y > mid ) change2 ( p << 1 | 1 , mid + 1 , r , x , y , z ) ; t[p].val = ( t[p<<1].val + t[p<<1|1].val ) ; t[p].maxa = max ( t[p<<1].maxa , t[p<<1|1].maxa ) ; t[p].maxb = max ( t[p<<1].maxb , t[p<<1|1].maxb ) ; }
LL ask1 ( int p , int l , int r , int x , int y ) { if ( x <= l && r <= y ) { return t[p].val ; } int mid = ( l + r ) >> 1 ; LL ans = 0 ; spread ( p , l , r ) ; if ( x <= mid ) ans += ask1 ( p << 1 , l , mid , x , y ) ; if ( y > mid ) ans += ask1 ( p << 1 | 1 , mid + 1 , r , x , y ) ; return ans ; }
LL ask2 ( int p , int l , int r , int x , int y ) { if ( x <= l && r <= y ) { return t[p].maxa ; } int mid = ( l + r ) >> 1 ; LL ans = 0x7fffffff ; spread ( p , l , r ) ; if ( x <= mid ) ans = min ( ans , ask2 ( p << 1 , l , mid , x , y ) ) ; if ( y > mid ) ans = min ( ans , ask2 ( p << 1 | 1 , mid + 1 , r , x , y ) ) ; return ans ; }
LL ask3 ( int p , int l , int r , int x , int y ) { if ( x <= l && r <= y ) { return t[p].maxb ; } int mid = ( l + r ) >> 1 ; LL ans = 0x7fffffff ; spread ( p , l , r ) ; if ( x <= mid ) ans = min ( ans , ask3 ( p << 1 , l , mid , x , y ) ) ; if ( y > mid ) ans = min ( ans , ask3 ( p << 1 | 1 , mid + 1 , r , x , y ) ) ; return ans ; }
int main ( ) { int n , m ; scanf ( "%d%d" , & n , & m ) ; for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%lld" , & a[i] ) ; build ( 1 , 1 , n ) ; while ( m -- ) { int op ; scanf ( "%d" , & op ) ; if ( op == 1 ) { int l , r ; LL k ; scanf ( "%d%d%lld" , & l , & r , & k ) ; change1 ( 1 , 1 , n , l , r , k ) ; } else if ( op == 2 ) { int l , r ; LL k ; scanf ( "%d%d%lld" , & l , & r , & k ) ; change2 ( 1 , 1 , n , l , r , k ) ; } else if ( op == 3 ) { int l , r ; scanf ( "%d%d" , & l , & r ) ; printf ( "%lld" , ask1 ( 1 , 1 , n , l , r ) ) ; } else if ( op == 4 ) { int l , r ; scanf ( "%d%d" , & l , & r ) ; printf ( "%lld" , ask2 ( 1 , 1 , n , l , r ) ) ; } else { int l , r ; scanf ( "%d%d" , & l , & r ) ; printf ( "%lld" , ask3 ( 1 , 1 , n , l , r ) ) ; } } return 0 ; }
|