ACM线段树。第兵布阵

来源:互联网 发布:mac 桌面文件太多 编辑:程序博客网 时间:2024/05/18 19:21
#include <iostream>#include <string.h>#include<stdio.h>using namespace std;#define max 50001struct node{int l, r, sum;}a[200000];void set(int l, int r, int i){a[i].l = l;a[i].r = r;a[i].sum = 0;if (l == r){scanf("%d", &a[i].sum);return;//建立中录入数据}else{set(l, (l + r) / 2, i * 2);set((l + r) / 2 + 1, r, i * 2 + 1);a[i].sum = a[i * 2].sum + a[i * 2 + 1].sum;}}//建立void add(int x, int y, int i){if (a[i].l == a[i].r){a[i].sum += y;return;}int mid = (a[i].l + a[i].r) / 2;if (mid >= x)add(x, y, i * 2);else if (mid < x)add(x, y, 2 * i + 1);a[i].sum = a[i * 2].sum + a[i * 2 + 1].sum;}//加减运算int find(int l, int r, int i){if (a[i].l == l&&a[i].r == r){return a[i].sum;}int mid = (a[i].l + a[i].r) / 2;if (r <= mid){return find(l, r, i * 2);}else{if (l > mid){return find(l, r, i * 2 + 1);}else{return find(l, mid, i * 2) + find(mid + 1, r, i * 2 + 1);}}}//查询int main(){int t;scanf("%d", &t);for (int q = 1; q <= t; q++){printf("Case %d:\n", q);int n;scanf("%d", &n);set(1, n, 1);char str[10];int x, y;while (1){scanf("%s", str);if (str[0] == 'E')break;if (str[0] == 'S'){scanf("%d %d", &x, &y);add(x, -y, 1);//加负为减}else{if (str[0] == 'A'){scanf("%d %d", &x, &y);add(x, y, 1);}else{if (str[0] == 'Q'){scanf("%d %d", &x, &y);printf("%d\n", find(x, y, 1));}}}}}return 0;}

0 0
原创粉丝点击