1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
简单线段树……orz
#include <stdio.h> #include <algorithm> using namespace std; typedef struct { int l,r,num; }Tree; Tree tree[500000]; int a[50005]; char str[10]; void Build(int t,int l,int r) { int mid; tree[t].l=l; tree[t].r=r; if (l==r) { tree[t].num=a[l]; return; } mid=(l+r)/2; Build(2*t+1,l,mid); Build(2*t+2,mid+1,r); tree[t].num=tree[2*t+1].num+tree[2*t+2].num; } void Add(int t,int x,int y) { int l,r,mid; l=tree[t].l; r=tree[t].r; tree[t].num+=y; if (l==r) return; mid=(l+r)/2; if (x<=mid) Add(2*t+1,x,y); if (x>mid) Add(2*t+2,x,y); } int Find(int t,int x,int y) { int l,r,mid,ans; l=tree[t].l; r=tree[t].r; if (l==x && r==y) return tree[t].num; mid=(l+r)/2; ans=0; if (x<=mid) ans+=Find(2*t+1,x,min(y,mid)); if (y>mid) ans+=Find(2*t+2,max(x,mid+1),y); return ans; } int main() { int i,j,n,T,x,y,cnt=1; scanf("%d",&T); while(T--) { scanf("%d",&n); for (i=0;i<n;i++) { scanf("%d",&a[i]); } Build(0,0,n-1); printf("Case %d:\n",cnt++); while(1) { scanf("%s",str); if (str[0]=='E') break; scanf("%d%d",&x,&y); if (str[0]=='Q') printf("%d\n",Find(0,x-1,y-1)); else if (str[0]=='A') Add(0,x-1,y); else Add(0,x-1,-y); } } return 0; }