Description–
一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。
Input–
第1行:方格个数
第2行:有m组操作
接下来m行:操作
Output–
对于每一个‘C’,一行一个整数表示结果。
Sample Input–
20
6
M 1 1
M 2 2
M 3 4
M 3 -5
M 6 7
C 2 6
Sample Output–
8
说明–
M:表示修改,第一个表示格子位置,第二个数表示在原来的基础上加上的数,
C:表示统计 ,第一个数表示起始位置,第二个数表示结束位置
代码–
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, x, y, tree[400005];
char c;
void ist(int z, int l, int r)//修改
{
if (l == r)
{
tree[z] += y;
return ;
}
int mid = (l + r) / 2;
if (x <= mid) ist(2 * z, l, mid);
else ist(2 * z + 1, mid + 1, r);
tree[z] += y;
}
int find(int z, int l, int r, int xx, int yy)//统计
{
if (l == xx && r == yy)
return tree[z];
int mid = (l + r) / 2, ans = 0;
if (xx <= mid) ans = find(2 * z, l, mid, xx, min(mid, yy));
if (yy > mid) ans += find(2 * z + 1, mid + 1, r, max(mid + 1, xx), yy);
return ans;
}
int main()
{
scanf("%d%d", &n,&m);
for (int i = 1; i <= m; ++i)
{
getchar(), c = getchar();
scanf("%d%d", &x,&y);
if (c == 'M')
ist(1, 1, n);
if (c == 'C')
printf("%d\n", find(1, 1, n, x, y));
}
return 0;
}