地址: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; }