您的位置:首页 > 其它

【NOIP模板】 树状数组

2017-09-22 16:27 495 查看
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char s[10];
int t[50010], a[50010], n, T;

int lowbit(int x) {
return x & (- x);
}

void add(int x, int pos) {
while(pos <= n) {
t[pos] += x;
pos += lowbit(pos);
}
}

int find(int x) {
int ans = 0;
while(x) {
ans += t[x];
x -= lowbit(x);
}
return ans;
}

void init(int x) {
printf("Case %d:\n", x);
memset(t, 0, sizeof(t));
}

int main() {
scanf("%d", &T);
for(int k = 1; k <= T; k ++) {
init(k);
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]), add(a[i], i);
int i, j;
while(scanf("%s", s) && s[0] != 'E') {
if(s[0] == 'A') {
scanf("%d %d", &i, &j);
add(j, i);
}
else if(s[0] == 'S') {
scanf("%d %d", &i, &j);
add(-j, i);
}
else {
scanf("%d %d", &i, &j);
printf("%d\n", find(j) - find(i - 1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: