POJ 3468 Lazy标记

来源:互联网 发布:热设计软件 编辑:程序博客网 时间:2024/05/01 09:43

代码如下:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#define int long longusing namespace std;const int maxn=100000+5;int n,q;char c;struct Tree{    int l,r,sum,lazy;}tree[maxn*4];inline void build(int l,int r,int tr){    tree[tr].l=l,tree[tr].r=r,tree[tr].sum=0,tree[tr].lazy=0;    if(l==r)        return;    int mid=(l+r)>>1;    build(l,mid,tr<<1),build(mid+1,r,tr<<1|1);}inline void change(int l,int r,int val,int tr){    if(tree[tr].l==l&&tree[tr].r==r){        tree[tr].lazy+=val,tree[tr].sum+=(r-l+1)*val;        return;    }    int mid=(tree[tr].l+tree[tr].r)>>1;    if(tree[tr].lazy!=0){        change(tree[tr].l,mid,tree[tr].lazy,tr<<1);        change(mid+1,tree[tr].r,tree[tr].lazy,tr<<1|1);        tree[tr].lazy=0;     }    if(l>mid)        change(l,r,val,tr<<1|1);    else if(r<=mid)        change(l,r,val,tr<<1);    else        change(l,mid,val,tr<<1),change(mid+1,r,val,tr<<1|1);    tree[tr].sum=tree[tr<<1].sum+tree[tr<<1|1].sum;}inline int query(int l,int r,int tr){    if(tree[tr].l==l&&tree[tr].r==r)        return tree[tr].sum;    int mid=(tree[tr].l+tree[tr].r)>>1;    if(tree[tr].lazy!=0){        change(tree[tr].l,mid,tree[tr].lazy,tr<<1);        change(mid+1,tree[tr].r,tree[tr].lazy,tr<<1|1);        tree[tr].lazy=0;     }    if(l>mid)        return query(l,r,tr<<1|1);    else if(r<=mid)        return query(l,r,tr<<1);    else        return query(l,mid,tr<<1)+query(mid+1,r,tr<<1|1);}signed main(void){    scanf("%lld%lld",&n,&q),build(1,n,1);    for(int i=1,x;i<=n;i++)        scanf("%lld",&x),change(i,i,x,1);    for(int i=1,x,y,z;i<=q;i++){        cin>>c;        if(c=='Q')            scanf("%lld%lld",&x,&y),cout<<query(x,y,1)<<endl;        else            scanf("%lld%lld%lld",&x,&y,&z),change(x,y,z,1);    }    return 0;}

by >_< neighthorn

0 0