线段树区间修改及查询
代码如下:
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
struct tree{
int left, right;
long long sum, lazy;
} tree[maxn * 4];
int a[maxn];
void build( int id, int l, int r){
tree[id].left = l;
tree[id].right = r;
tree[id].lazy = 0;
if ( l == r){
tree[id].sum = a[l];
return;
}
int mid = ( l + r) / 2;
build( id * 2, l, mid);
build( id * 2 + 1, mid + 1, r);
tree[id].sum = tree[id * 2].sum + tree[id * 2 + 1].sum;
}
void push_down( int id){
if ( tree[id].lazy != 0){
tree[id * 2].sum = ( tree[id * 2].right - tree[id * 2].left + 1) * tree[id].lazy;
tree[id * 2].lazy = tree[id].lazy;
tree[id * 2 + 1].sum = ( tree[id * 2 + 1].right - tree[id * 2 + 1].left + 1) * tree[id].lazy;
tree[id * 2 + 1].lazy = tree[id].lazy;
tree[id].lazy = 0;
}
}
void update_interval( int id, int l, int r, int val){
if ( tree[id].left == l && r == tree[id].right){
tree[id].sum = ( long long)val * ( tree[id].right - tree[id].left + 1);
tree[id].lazy = val;
}
else{
push_down( id);
int mid = ( tree[id].left + tree[id].right) / 2;
if ( r <= mid) update_interval( id * 2, l, r, val);
else if ( l > mid) update_interval( id * 2 + 1, l, r, val);
else{
update_interval( id * 2, l, mid, val);
update_interval( id * 2 + 1, mid + 1, r, val);
}
tree[id].sum = tree[id * 2].sum + tree[id * 2 + 1].sum;
}
}
long long query_sum( int id, int l, int r){
if ( tree[id].left == l && tree[id].right == r)
return tree[id].sum;
push_down( id);
int mid = ( tree[id].right + tree[id].left) / 2;
if ( r <= mid) return query_sum( id * 2, l, r);
if ( l > mid) return query_sum( id * 2 + 1, l, r);
return query_sum( id * 2, l, mid) + query_sum( id * 2 + 1, mid + 1, r);
}
int main()
{
int n, q, x, l, r, v;
scanf( "%d", &n);
for ( int i = 1; i <= n; i++){
scanf( "%d", &a[i]);
}
build( 1, 1, n);
scanf( "%d", &q);
while ( q--){
scanf( "%d", &x);
if ( x){
scanf( "%d%d%d", &l, &r, &v);
update_interval( 1, l, r, v);
}
else{
scanf( "%d%d", &l, &r);
printf( "%lld\n", query_sum( 1, l, r));
}
}
return 0;
}