树状数组裸题。
细节参见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 200000 + 5;
const int INF = 1000000000;
int n,m,x,y,a[maxn],kase = 0,bit[maxn];
ll sum(int x) {
ll ret = 0;
while(x > 0) {
ret += bit[x]; x -= (x & -x);
}
return ret;
}
void add(int x,int d) {
while(x <= n) {
bit[x] += d; x += (x & -x);
}
}
char s[10];
int main() {
while(~scanf("%d",&n)&&n) {
memset(bit,0,sizeof(bit));
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
add(i,a[i]);
}
if(kase) printf("\n");
printf("Case %d:\n",++kase);
while(~scanf("%s",s)&&s[0]!='E') {
scanf("%d%d",&x,&y);
if(s[0] == 'S') {
add(x,y-a[x]);
a[x] = y;
}
else printf("%d\n",sum(y)-sum(x-1));
}
}
return 0;
}