题意:
给你N个数据,现在有无数个查询(每次不超过4W)。
线段树的单点更新。
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
#define Lchild rt<<1,L,m
#define Rchild rt<<1|1,m+1,R
int T,N;
int tree[50010*3];
void push_up(int rt)
{
tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
}
void build(int rt = 1, int L = 1, int R = N)
{
if (L == R)
{
cin >> tree[rt];
return;
}
int m = (L + R) >> 1;
build(Lchild);
build(Rchild);
push_up(rt);
}
int query(int l, int r, int rt = 1, int L = 1, int R = N)
{
if (l <= L&&R <= r)
{
return tree[rt];
}
int m = (L + R) >> 1;
int ret = 0;
if (l <= m)
ret += query(l, r, Lchild);
if (r > m)
ret += query(l, r, Rchild);
return ret;
}
void update(int p,int delta,int rt = 1, int L = 1, int R = N)
{
if (L == R)
{
tree[rt] += delta;
return;
}
int m = (L + R) >> 1;
if (p <= m)
update(p, delta, Lchild);
else
update(p, delta, Rchild);
push_up(rt);
}
int main()
{
cin >> T;
string str;
int a, b;
char s[8] = "";
for (int i = 1; i <= T; i++)
{
cin >> N;
build();
cout << "Case " << i <<":"<< endl;
while (1)
{
scanf("%s", s);
if (!strcmp(s, "End"))
break;
scanf("%d%d", &a, &b);
if (!strcmp(s, "Query"))
{
cout << query(a, b) << endl;
}
else if (!strcmp(s, "Add"))
{
update(a, b);
}
else if (!strcmp(s, "Sub"))
{
update(a, -b);
}
}
}
}