#include <bits/stdc++.h> using namespace std; #define maxn 50000+10 int T, N, a[maxn], sum[maxn<<2]; void push_up(int root) { sum[root] = sum[root<<1] + sum[root<<1|1]; } void Build(int L, int R, int root)///递归构造 { if(L == R) { cin>>sum[root]; return ; } int mid = (L + R) >> 1; Build(L, mid, root<<1); Build(mid+1, R, root<<1|1); push_up(root); } void update(int q, int value, int L, int R, int root) { if(L == R) { sum[root] += value; return ; } int mid = (L + R) >> 1; if(q <= mid) update(q, value, L, mid, root<<1); else update(q, value, mid+1, R, root<<1|1); push_up(root); } int query(int l, int r, int L, int R, int root) { int res = 0; if(l <= L && r >= R) return sum[root]; int mid = (L + R) >> 1; if(l <= mid) res += query(l, r, L, mid, root<<1); if(r > mid) res += query(l, r, mid+1, R, root<<1|1); return res; } int main() { cin>>T; int Case = 0; while(T--) { cout<<"Case "<<++Case<<":"<<endl; cin>>N; Build(1, 10, 1); string s; while(cin>>s && s[0] != 'E') { int x, y; switch(s[0]) { case 'Q': cin>>x>>y; cout<<query(x, y, 1, N, 1)<<endl; break; case 'A': cin>>x>>y; update(x, y, 1, N, 1); break; case 'S': cin>>x>>y; update(x, -y, 1, N, 1); break; } } } return 0; }
原文地址:http://blog.csdn.net/dojintian/article/details/44408477