描述
题解
结点更新,区间求和,基础线段树。
代码
#include <iostream>
#include <string>
using namespace std;
const int MAXN = 50000;
string str;
int sum; // 记录总兵数
int num[MAXN + 1] = {
0}; // 记录各个兵营的兵数
typedef struct node
{
int left;
int right;
int data;
node *lchild;
node *rchild;
node()
{
left = right = data = 0;
}
} Tree;
Tree *CreateTree(int a, int b)
{
Tree *r;
r = (Tree *)malloc(sizeof(Tree));
r->left = a;
r->right = b;
if (a == b)
{
r->data = num[a];
r->lchild = r->rchild = NULL;
}
else
{
int mid = (a + b) >> 1;
r->lchild = CreateTree(a, mid);
r->rchild = CreateTree(mid + 1, b);
r->data = r->lchild->data + r->rchild->data;
}
return r;
}
void update(Tree *r, int a, int b)
{
if (r->left == a && r->right == a)
{
r->data += b;
return;
}
int mid = (r->left + r->right) >> 1;
if (a <= mid)
{
update(r->lchild, a, b);
}
else
{
update(r->rchild, a, b);
}
r->data += b;
}
void find(Tree* r, int a, int b)
{
if (r->left == a && r->right == b)
{
sum += r->data;
return ;
}
int mid = (r->left + r->right)>>1;
if (b <= mid)
{
find(r->lchild, a, b);
}
else if (a > mid)
{
find(r->rchild, a, b);
}
else
{
find(r->lchild, a, mid);
find(r->rchild, mid + 1, b);
}
}
int main()
{
int T;
scanf("%d",&T);
int n, x, y;
int key = 0;
while (T--)
{
printf("Case %d:\n", ++key);
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
}
Tree *T;
T = CreateTree(1, n);
while (cin >> str)
{
if (str == "Query")
{
sum = 0;
scanf("%d%d", &x, &y);
find(T, x, y);
printf("%d\n", sum);
}
else if (str == "Add")
{
scanf("%d%d", &x, &y);
update(T, x, y);
}
else if (str == "Sub")
{
scanf("%d%d", &x, &y);
update(T, x, -y);
}
else
{
break;
}
}
}
return 0;
}