您的位置:首页 > 其它

线段树(单点更新(模板)) 之 hdu 1166

2014-07-24 20:49 369 查看
//  [7/24/2014 Sjm]
/*
第一道用线段树做的题,照着大神的代码风格写的,,就当作线段树单点更新的模板吧。。。。(当年用树状数组做的:代码见这里)
*/

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define GetMid l + ((r-l) >> 1)

const int MAX = 50005;
int sum[MAX << 2];

void PushUp(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; }

void Build(int l, int r, int rt) {
if (l == r) { scanf("%d", &sum[rt]); return; }
int m = GetMid;
Build(lson);
Build(rson);
PushUp(rt);
}

void Update(int pos, int add, int l, int r, int rt) {
if (l == r) { sum[rt] += add; return; }
int m = GetMid;
if (pos <= m) { Update(pos, add, lson); }
else { Update(pos, 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 ret = 0;
int m = GetMid;
if (L <= m) { ret += Query(L, R, lson); }
if (R > m) { ret += Query(L, R, rson); }
return ret;
}

int main()
{
//freopen("input.txt", "r", stdin);
int T, N, a, b;
scanf("%d", &T);
for (int cas = 1; cas <= T; ++cas) {
printf("Case %d:\n", cas);
scanf("%d", &N);
Build(1, N, 1);
char str[10];
while (scanf("%s", str) && 'E' != str[0]) {
scanf("%d %d", &a, &b);
if ('Q' == str[0]) { printf("%d\n", Query(a, b, 1, N, 1)); }
else {
if ('A' == str[0]) { Update(a, b, 1, N, 1); }
else { Update(a, -b, 1, N, 1); }
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息