地址:http://acm.hdu.edu.cn/showproblem.php?pid=1166
代码:
/**
* 题意:对长度为N的数组,进行修改元素值,和查询[a,b]区间值的操作
* 解题思路:线段树模板题
*/
#include <stdio.h>
#define lson l , m , rt*2
#define rson m + 1 , r , rt*2+1
const int maxn = 55555;
int sum[maxn * 4];
void PushUP(int rt)
{
sum[rt] = sum[rt * 2] + sum[rt * 2 + 1];
}
void build(int l, int r, int rt)
{
if (l == r)
{
scanf("%d", &sum[rt]);
return;
}
int m = (l + r) / 2;
build(lson);
build(rson);
PushUP(rt);
}
void update(int p, int add, int l, int r, int rt)
{
if (l == r)
{
sum[rt] += add;
return;
}
int m = (l + r) / 2;
if (p <= m)
update(p, add, lson);
else
update(p, add, rson);
PushUP(rt);
}
int query(int L, int R, int l, int r, int rt)
{
if (L <= l && r <= R)
{
return sum[rt];
}
int m = (l + r) / 2;
int ret = 0;
if (L <= m)
ret += query(L, R, lson);
if (R > m)
ret += query(L, R, rson);
return ret;
}
int main()
{
int T, n;
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++)
{
printf("Case %d:\n", cas);
scanf("%d", &n);
build(1, n, 1);
char op[10];
while (scanf("%s", op))
{
if (op[0] == 'E') break;
int a, b;
scanf("%d%d", &a, &b);
if (op[0] == 'Q')
printf("%d\n", query(a, b, 1, n, 1));
else if (op[0] == 'S')
update(a, -b, 1, n, 1);
else
update(a, b, 1, n, 1);
}
}
return 0;
}