題目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3238
簡單樹狀數組。。
#include <cmath>#include <ctime>#include <iostream>#include <string>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <map>#include <set>#include <algorithm>#include <cctype>#include <stack>#include <deque>using namespace std;typedef long long LL;#define EPS 10e-9#define INF 0x3f3f3f3f#define REP(i,n) for(int i=0; i<(n); i++)const int maxn = 200000+100;int n;int c[maxn],d[maxn];int lowbit(int x){ return x&-x;}void add(int x,int d){ while(x<=n){ c[x]+=d; x+=lowbit(x); }}int sum(int x){ int ret=0; while(x>0){ ret+=c[x]; x-=lowbit(x); } return ret;}int main(){ char str[1000]; int x,y,ca=1; bool f=true; while(scanf("%d",&n)!=EOF){ if(n==0) break; memset(c,0,sizeof(c)); for(int i=1;i<=n;i++){ scanf("%d",&d[i]); add(i,d[i]); } if( !f ) printf("\n"); f = false; printf("Case %d:\n",ca++); while(1){ scanf("%s",str); if(strcmp(str,"END")==0) break; scanf("%d%d",&x,&y); if(str[0]=='S'){ int t=d[x]; d[x]=y; add(x,-t); add(x,y); } else{ printf("%d\n",sum(y)-sum(x-1)); } } } return 0;}