线段树
来源:互联网 发布:手机淘宝怎么找优惠券 编辑:程序博客网 时间:2024/05/17 08:58
线段树
struct node{ int l,r,lc,rc; long long sum,tag;}t[2*MAXN+1];int tcnt;int na[MAXN+1];void pushDown(int o){ if(!t[o].tag) return; long long tag=t[o].tag;int lc=t[o].lc,rc=t[o].rc; t[lc].tag+=tag;t[lc].sum+=(t[lc].r-t[lc].l+1)*tag; t[rc].tag+=tag;t[rc].sum+=(t[rc].r-t[rc].l+1)*tag; t[o].tag=0;}void buildTree(int o,int l,int r){ t[o].l=l;t[o].r=r; if(l==r) { t[o].sum=na[l];return; } int mid=(l+r)>>1; t[o].lc=++tcnt;buildTree(t[o].lc,l,mid); t[o].rc=++tcnt;buildTree(t[o].rc,mid+1,r); t[o].sum=t[t[o].lc].sum+t[t[o].rc].sum;}void chDet(int o,int ql,int qr,int x){ if(ql<=t[o].l&&t[o].r<=qr) { t[o].tag+=x;t[o].sum+=x*(t[o].r-t[o].l+1); return; } int mid=(t[o].l+t[o].r)>>1; pushDown(o); if(ql<=mid) chDet(t[o].lc,ql,qr,x); if(qr>mid) chDet(t[o].rc,ql,qr,x); t[o].sum=t[t[o].lc].sum+t[t[o].rc].sum;} long long calSum(int o,int ql,int qr){ if(ql<=t[o].l&&t[o].r<=qr) return t[o].sum; int mid=(t[o].l+t[o].r)>>1;long long ans=0; pushDown(o); if(ql<=mid) ans+=calSum(t[o].lc,ql,qr); if(qr>mid) ans+=calSum(t[o].rc,ql,qr); return ans;}
0 0