区间查询/区间修改(加减)的模板代码
# include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10 ;
int a[ N] ;
struct node
{
int l, r, sum, lz;
int mx, mn;
} T[ N* 4 ] ;
void build ( int i, int l, int r)
{
T[ i] . l = l;
T[ i] . r = r;
T[ i] . lz = 0 ;
if ( l == r)
{
T[ i] . sum = T[ i] . mx = T[ i] . mn = a[ l] ;
return ;
}
int mid = ( l+ r) >> 1 ;
build ( i* 2 , l, mid) ;
build ( i* 2 + 1 , mid+ 1 , r) ;
T[ i] . sum = T[ i* 2 ] . sum+ T[ i* 2 + 1 ] . sum;
T[ i] . mx = max ( T[ i* 2 ] . mx, T[ i* 2 + 1 ] . mx) ;
T[ i] . mn = max ( T[ i* 2 ] . mn, T[ i* 2 + 1 ] . mn) ;
}
push_down ( int i)
{
if ( T[ i] . lz)
{
T[ i* 2 ] . lz += T[ i] . lz;
T[ i* 2 + 1 ] . lz += T[ i] . lz;
T[ i* 2 ] . sum += T[ i] . lz * ( T[ i* 2 ] . r - T[ i* 2 ] . l + 1 ) ;
T[ i* 2 + 1 ] . sum += T[ i] . lz * ( T[ i* 2 + 1 ] . r - T[ i* 2 + 1 ] . l + 1 ) ;
T[ i] . lz = 0 ;
}
}
void update ( int i, int l, int r, int k)
{
if ( T[ i] . l>= l && T[ i] . r<= r)
{
T[ i] . sum += k* ( T[ i] . r- T[ i] . l+ 1 ) ;
T[ i] . lz += k;
return ;
}
if ( T[ i] . r< l || T[ i] . l> r)
return ;
push_down ( i) ;
if ( T[ i* 2 ] . r>= l)
update ( i* 2 , l, r, k) ;
if ( T[ i* 2 + 1 ] . l<= r)
update ( i* 2 + 1 , l, r, k) ;
T[ i] . sum = T[ i* 2 ] . sum + T[ i* 2 + 1 ] . sum;
T[ i] . mx = max ( T[ i* 2 ] . mx, T[ i* 2 + 1 ] . mx) ;
T[ i] . mn = max ( T[ i* 2 ] . mn, T[ i* 2 + 1 ] . mn) ;
}
int query ( int i, int l, int r)
{
if ( T[ i] . l>= l && T[ i] . r<= r)
return T[ i] . sum;
if ( T[ i] . r< l || T[ i] . l> r)
return 0 ;
push_down ( i) ;
int ans = 0 ;
if ( T[ i* 2 ] . r>= l)
ans += query ( i* 2 , l, r) ;
if ( T[ i* 2 + 1 ] . l<= r)
ans += query ( i* 2 + 1 , l, r) ;
return ans;
}
int main ( )
{
char c;
int n, q, u, v, w;
scanf ( "%d%d" , & n, & q) ;
for ( int i = 1 ; i<= n; i++ )
{
scanf ( "%d" , & a[ i] ) ;
}
build ( 1 , 1 , n) ;
while ( q-- )
{
getchar ( ) ;
scanf ( "%c" , & c) ;
if ( c == 'Q' )
{
scanf ( "%d%d" , & u, & v) ;
printf ( "%d\n" , query ( 1 , u, v) ) ;
}
else
{
scanf ( "%d%d%d" , & u, & v, & w) ;
update ( 1 , u, v, w) ;
}
}
return 0 ;
}