解析
线段树点操作版题,注意范围判断。
代码
#include<bits/stdc++.h> #define MAXN 50004 using namespace std; int s_tree[4*MAXN]; int n; void up(int p) { s_tree[p]=s_tree[p*2]+s_tree[p*2+1]; } void modify(int p,int l,int r,int x,int v,int flag) { if(l==r) { if(flag==1) { s_tree[p]+=v; return; } else { s_tree[p]-=v; return; } } int mid=(l+r)/2; if(x<=mid) modify(p*2,l,mid,x,v,flag); else modify(p*2+1,mid+1,r,x,v,flag); up(p); } int query(int p,int l,int r,int x,int y) { if(x<=l&&r<=y)//范围判断 { return s_tree[p]; } int res=0; int mid=(l+r)/2; if(x<=mid) res+=query(p*2,l,mid,x,y); if(y>mid) res+=query(p*2+1,mid+1,r,x,y); return res; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { int a; cin>>a; modify(1,1,n,i,a,1); } string st; int sa,sb; while(cin>>st) { if(st=="End") break; cin>>sa>>sb; if(st=="Query") { cout<<query(1,1,n,sa,sb)<<endl; } else if(st=="Add") { modify(1,1,n,sa,sb,1); } else if(st=="Sub") { modify(1,1,n,sa,sb,0); } } return 0; }