hdu 1166 敌兵布阵
单点更新,区间查询和。
http://acm.hdu.edu.cn/showproblem.php?pid=1166
#define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=50010; struct ST { int l,r; int sum; }st[maxn<<2]; void pushUp(int i) { st[i].sum=st[i<<1].sum+st[(i<<1)|1].sum; } void build(int i,int l,int r) { st[i].l=l; st[i].r=r; if(st[i].l==st[i].r) { rd(st[i].sum); return; } int mid=(st[i].l+st[i].r)>>1; build(i<<1,l,mid); build((i<<1)|1,mid+1,r); pushUp(i); } void add(int i,int p,int val) { if(st[i].l==st[i].r) { st[i].sum+=val; return; } int mid=(st[i].l+st[i].r)>>1; if(p<=mid) add(i<<1,p,val); else add((i<<1)|1,p,val); pushUp(i); } int query(int i,int L,int R) { if(st[i].l==L&&st[i].r==R) { return st[i].sum; } int mid=(st[i].l+st[i].r)>>1; if(R<=mid) return query(i<<1,L,R); else if(L>mid) return query((i<<1)|1,L,R); else return query(i<<1,L,mid)+query((i<<1)|1,mid+1,R); } int n; char cm[10]; int main() { int cas=1; int t;rd(t); while(t--) { printf("Case %d:\n",cas++); rd(n); build(1,1,n); while(scanf("%s",cm)) { if(cm[0]=='Q') { int l,r; rd2(l,r); printf("%d\n",query(1,l,r)); } else if(cm[0]=='A') { int p,val; rd2(p,val); add(1,p,val); } else if(cm[0]=='S') { int p,val; rd2(p,val); add(1,p,-val); } else break; } } return 0; }
原文:http://blog.csdn.net/sr_19930829/article/details/43883395