HDU1166 敌兵布阵

来源:互联网 发布:竞优软件 编辑:程序博客网 时间:2024/05/22 14:06
/*线段树 单点更新*/#include <iostream>#include <string>#include <cstdio>using namespace std;const int maxn = 50000 + 5;struct node {int l, r, sum;};node tree[maxn * 4];int t, cas = 0, n, ans;char s[10];void build(int l, int r, int root){tree[root].l = l;tree[root].r = r;if (l == r) {scanf("%d", &tree[root].sum);return;}int mid = (tree[root].l + tree[root].r) >> 1;build(l, mid, root << 1);build(mid + 1, r, root << 1 | 1);tree[root].sum = tree[root << 1].sum + tree[root << 1 | 1].sum;}void query(int l, int r, int root, int L, int R){if (L <= l && R >= r) {ans += tree[root].sum;return;}int mid = (tree[root].l + tree[root].r) >> 1;if (R <= mid)query(l, mid, root << 1, L, R);else if (L > mid)query(mid + 1, r, root << 1 | 1, L, R);else {query(l, mid, root << 1, L, R);query(mid + 1, r, root << 1 | 1, L, R);}}void update(int l, int r, int root, int pos, int add){if (l == r) {tree[root].sum += add;return;}int mid = (tree[root].l + tree[root].r) >> 1;if (pos <= mid)update(l, mid, root << 1, pos, add);elseupdate(mid + 1, r, root << 1 | 1, pos, add);tree[root].sum = tree[root << 1].sum + tree[root << 1 | 1].sum;}int main(){cin >> t;while (t--) {cin >> n;cout << "Case " << ++cas << ":" << endl;build(1, n, 1);int x, y;while (scanf("%s", s) && s[0] != 'E') {scanf("%d%d", &x, &y);if (s[0] == 'Q') {ans = 0;query(1, n, 1, x, y);printf("%d\n", ans);}else if (s[0] == 'A') {update(1, n, 1, x, y);}else {update(1, n, 1, x, -y);}}}return 0;}

0 0
原创粉丝点击