hihoCoder 1078 线段树的区间修改

来源:互联网 发布:mysql and or 同时存在 编辑:程序博客网 时间:2024/05/21 03:16




<pre name="code" class="cpp">#include <iostream>#include <cstdio>#include <cstring>#define N 100005using namespace std;struct node{    int l,r,sum;    int sett;}tree[N<<2];int a[N];int ans;void build(int m,int l,int r){    tree[m].l = l;    tree[m].r = r;    tree[m].sett = -1;    if(l == r){        tree[m].sum = a[l];        return;    }    int mid = (l+r)>>1;    build(m<<1,l,mid);    build((m<<1)+1,mid+1,r);    tree[m].sum = tree[m<<1].sum + tree[(m<<1)+1].sum;}void pushdown(int m){    if(tree[m].l >= tree[m].r)        return;    if(tree[m].sett != -1){        tree[m<<1].sett = tree[(m<<1)+1].sett = tree[m].sett;        tree[m<<1].sum = (tree[m<<1].r-tree[m<<1].l+1)*tree[m].sett;        tree[(m<<1)+1].sum = (tree[(m<<1)+1].r-tree[(m<<1)+1].l+1)*tree[m].sett;        tree[m].sett = -1;    }}void maintain(int m){    tree[m].sum = tree[m<<1].sum + tree[(m<<1)+1].sum;}void update(int m,int l,int r,int val){    if(tree[m].l >= l && tree[m].r <= r){        tree[m].sett = val;        tree[m].sum = (tree[m].r-tree[m].l+1)*val;        return;    }    pushdown(m);    int mid = (tree[m].l+tree[m].r)>>1;    if(l <= mid)        update(m<<1,l,r,val);    if(mid < r)        update((m<<1)+1,l,r,val);    maintain(m);}void query(int m,int l,int r){    if(tree[m].l >= l && tree[m].r <= r){        ans += tree[m].sum;        return;    }    pushdown(m);    int mid = (tree[m].l+tree[m].r)>>1;    if(l <= mid)        query(m<<1,l,r);    if(mid < r)        query(m<<1|1,l,r);    maintain(m);}int main(){    int n,m;    while(~scanf("%d",&n)){        for(int i = 1; i <= n; i++)            scanf("%d",&a[i]);        build(1,1,n);        scanf("%d",&m);        int op,a,b,c;        for(int i = 1; i <= m; i++){            scanf("%d",&op);            if(op == 0){                ans = 0;                scanf("%d%d",&a,&b);                query(1,a,b);                printf("%d\n",ans);            }            else{                scanf("%d%d%d",&a,&b,&c);                update(1,a,b,c);            }        }    }    return 0;}



0 0