hiho第二十週

線段樹區間修改及查詢

代碼如下:

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章