poj 3468

来源:互联网 发布:中学生编程大赛 编辑:程序博客网 时间:2024/06/05 16:03

线段树区间更新,区间查询。。

#include<iostream>#include<algorithm>using namespace std;#define MAXN 100005#define lson u<<1#define rson u<<1|1#define LL __int64struct Node{int lef,rig;LL sum,delta;//增值}T[MAXN<<2];int dat[MAXN];void Build(int u,int l,int r){T[u].lef=l;T[u].rig=r;T[u].delta=0;if(l==r){T[u].sum=dat[l];return;}int mid=(l+r)>>1;Build(lson,l,mid);Build(rson,mid+1,r);T[u].sum=T[lson].sum+T[rson].sum;}void Update(int u,int l,int r,LL v){if(l<=T[u].lef&&T[u].rig<=r){T[u].delta+=v;T[u].sum+=(T[u].rig-T[u].lef+1)*v;}else {if(T[u].delta){T[lson].delta+=T[u].delta;T[rson].delta+=T[u].delta;T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta;T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta;T[u].delta=0;}if(r<=T[lson].rig)Update(lson,l,r,v);else if(l>=T[rson].lef)Update(rson,l,r,v);else {Update(lson,l,T[lson].rig,v);Update(rson,T[rson].lef,r,v);}T[u].sum=T[lson].sum+T[rson].sum;}}LL Query(int u,int l,int r){if(l<=T[u].lef&&T[u].rig<=r){return T[u].sum;}else {if(T[u].delta){T[lson].delta+=T[u].delta;T[rson].delta+=T[u].delta;T[lson].sum+=(T[lson].rig-T[lson].lef+1)*T[u].delta;T[rson].sum+=(T[rson].rig-T[rson].lef+1)*T[u].delta;T[u].delta=0;}if(r<=T[lson].rig)return Query(lson,l,r);else if(l>=T[rson].lef)return Query(rson,l,r);else return Query(lson,l,T[lson].rig)+Query(rson,T[rson].lef,r);}}int main(){int N,Q,i;int x,y,z;char cmd;while(scanf("%d%d",&N,&Q)==2){for(i=1;i<=N;i++)scanf("%d",&dat[i]);Build(1,1,N);while(Q--){scanf(" %c",&cmd);if(cmd=='C'){scanf("%d%d%d",&x,&y,&z);Update(1,x,y,z);}else {scanf("%d%d",&x,&y);LL ans=Query(1,x,y);printf("%I64d\n",ans);}}}}


原创粉丝点击