Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 48050 Accepted Submission(s): 20317
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 100001 #define eps 1e-9 const int inf=0x7fffffff; //无限大 struct node { int l,r; int sum; }; node segtree[maxn*5]; int num[maxn]; void build(int i,int l,int r) { segtree[i].l=l; segtree[i].r=r; if(l==r) { segtree[i].sum=num[l]; return; } int mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); segtree[i].sum=segtree[i*2].sum+segtree[i*2+1].sum; } void add(int i,int t,int b) { segtree[i].sum+=b; if(segtree[i].l==t&&segtree[i].r==t) return; int mid=(segtree[i].l+segtree[i].r)/2; if(t<=mid) add(i*2,t,b); else add(i*2+1,t,b); } int query(int i,int l,int r) { if(segtree[i].l==l&&segtree[i].r==r) return segtree[i].sum; int mid=(segtree[i].l+segtree[i].r)/2; if(r<=mid) return query(i*2,l,r); else if(l>mid) return query(i*2+1,l,r); else return query(i*2,l,mid)+query(i*2+1,mid+1,r); } int main() { int cas=0; int t; cin>>t; while(t--) { cas++; printf("Case %d:\n",cas); int n; cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); } build(1,1,n); string s; while(cin>>s) { if(s=="End") break; int a,b; cin>>a>>b; if(s=="Add") { add(1,a,b); } else if(s=="Sub") { add(1,a,-b); } else cout<<query(1,a,b)<<endl; } } }