哎,又切了一天的水题。
线段树果然必须自己写出来才能叫真正的会了,之前一直在套模板确实不好。
这个题目是单点更新 之 单点增减,= ̄ω ̄=
#include <cstdio> const int maxn = ( << ); int n, qL, qR, p, v, sum[maxn]; void build(int o, int L, int R)
{
if(L == R) { scanf("%d", &sum[o]); return; }
int M = (L + R) / ;
build(o*, L, M);
build(o*+, M+, R);
sum[o] = sum[o*] + sum[o*+];
} void update(int o, int L, int R)
{
if(L == R) { sum[o] += v; return; }
int M = (L + R) / ;
if(p <= M) update(o*, L, M);
else update(o*+, M+, R);
sum[o] = sum[o*] + sum[o*+];
} int query(int o, int L, int R)
{
if(qL <= L && qR >= R) return sum[o]; int ans = ;
int M = (L +R) / ;
if(qL <= M) ans += query(o*, L, M);
if(qR > M) ans += query(o*+, M+, R);
return ans;
} char cmd[]; int main()
{
//freopen("in.txt", "r", stdin); int T; scanf("%d", &T); for(int kase = ; kase <= T; kase++)
{
printf("Case %d:\n", kase); scanf("%d", &n);
build(, , n); while(scanf("%s", cmd) == )
{
if(cmd[] == 'E') break;
if(cmd[] == 'Q')
{
scanf("%d%d", &qL, &qR);
printf("%d\n", query(, , n));
}
else
{
scanf("%d%d", &p, &v);
if(cmd[] == 'S') v = -v;
update(, , n);
}
}
} return ;
}
代码君