问题描述
一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。
样例输入
20 //方格个数
6 //有几组操作
M 1 1 //表示修改,第一个表示格子位置,第二个数表示在原来的基础上加上的数,
M 2 2
M 3 4
M 3 -5
M 6 7
C 2 6 //表示统计 ,第一个数表示起始位置,第二个数表示结束位置
样例输出
8
算法讨论
由于这是单纯的一个动态区间求和问题,我们可以用树状数组来替代线段树,可以缩短代码。定义C[i]:=a[i-2^k+1]+…+a[i],k为i在二进制下末尾零的个数。对于区间[x,y]我们可以用[1,y]-[1,x-1]来求。
const
maxn=10000;
var
a,c:array[1..maxn] of longint;
i,j,n,m,x,y,s:longint;
l,t:char;
function lowbit(x:longint):longint;
begin
x:=x and -x;
exit(x)
end;
procedure modity(p,delta:longint);
begin
while p<=n do
begin
inc(c[p],delta);
p:=p+lowbit(p)
end;
end;
function sum(x:longint):longint;
var
s:longint;
begin
s:=0;
while x>0 do
begin
inc(s,c[x]);
x:=x-lowbit(x)
end;
exit(s)
end;
begin
readln(n);
readln(m);
for i:=1 to m do
begin
readln(l,x,y);
if l='M'
then modity(x,y)
else begin
s:=sum(y)-sum(x-1);
writeln(s)
end;
end;
end.
Pixiv ID:37216666