题意:
单点add,区间sum。
题解:
线段树可以很好的写这个题,但是树状数组显得更加有效,快捷!
#include<bits/stdc++.h> using namespace std; const int maxn = 50000+10; int c[maxn]; int lowbit(int x) { return x & -x; } int sum(int x) { int res=0; while(x>0) { res+=c[x]; x-=lowbit(x); } return res; } void add(int x,int v) { while(x<maxn) { c[x]+=v; x+=lowbit(x); } } int main() { int t; cin>>t; for(int kase=1;kase<=t;kase++) { printf("Case %d:\n",kase); int n; cin>>n; for(int i=0;i<n+10;i++) c[i] = 0; for(int i=1;i<=n;i++) { int v; scanf("%d",&v); add(i,v); } char str[5]; while(scanf("%s",str)) { if(str[0] == 'E') break; else if(str[0] == 'Q') { int i,j; scanf("%d%d",&i,&j); printf("%d\n",sum(j)-sum(i-1) ); } else if(str[0] == 'A') { int x,v; scanf("%d%d",&x,&v); add(x,v); } else { int x,v; scanf("%d%d",&x,&v); add(x,-v); } } } }