#include <iostream>
#include <string.h>
#include<stdio.h>
using namespace std;
#define max 50001
struct 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;
}
ACM线段树。第兵布阵
最新推荐文章于 2021-08-02 16:24:52 发布