第一次线段树,模仿 HH 神牛的风格
XLyle 给我讲了一下,感觉果然比自己看效率高啊~
update():单点增减
query():区间求和
第一次被卡 cin 。。。
#include <cstdio>
#include <string>
using namespace std;
//人生第一次被卡 cin
const int maxn = 51000;
int sum[maxn<<2];
void pushUp(int rt)
{
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int rt, int l, int r)
{
if(l == r) {
scanf("%d", &sum[rt]);
return ;
}
int m = (l+r)>>1;
build(rt<<1, l, m);
build(rt<<1|1, m+1, r);
pushUp(rt);
}
void update(int pos, int add,int rt, int l, int r)
{
if(l == r) {
sum[rt] += add;
return ;
}
int m = (l+r)>>1;
if(pos <= m) update(pos, add, rt<<1, l, m);
else update(pos, add, rt<<1|1, m+1, r);
pushUp(rt);
}
int query(int L, int R, int rt, int l, int r)
{
if(L <= l && r <= R)
return sum[rt];
int m = (l+r)>>1;
int ret = 0;
if(L <= m) ret += query(L, R, rt<<1, l, m);
if(m < R) ret += query(L, R, rt<<1|1, m+1, r);
return ret;
}
int main()
{
int t, n;
char cmd[10];
scanf("%d", &t);
for(int ca = 1; ca <= t; ca++) {
scanf("%d", &n);
build(1, 1, n);
printf("Case %d:\n", ca);
while(~scanf("%s", cmd)) {
if(cmd[0] == 'A' || cmd[0] == 'S') {
int pos, add;
scanf("%d%d", &pos, &add);
if(cmd[0] == 'S') add *= -1;
update(pos, add, 1, 1, n);
} else if(cmd[0] == 'Q') {
int L, R;
scanf("%d%d", &L, &R);
printf("%d\n", query(L, R, 1, 1, n));
} else
break;
}
}
return 0;
}