题目
一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。
题解
线段树,定义域c为该区间(点)的值
1.插入数时,点到起点的路径都加上这个数
2.统计随便弄一弄
3.因为题目以端点为顶点,所以右儿子的左边界赋成mid+1
其他一样
时间复杂度O(m log n)
代码
var
t:array[1..1000000]of longint;
n,m,i,j,k,s:longint;
c:char;
procedure insert(p,l,r,a,b:longint);
var
m:longint;
begin
t[p]:=t[p]+b;
if l=r then exit;
m:=(l+r) div 2;
if a>=m+1 then insert(p*2+1,m+1,r,a,b) else
if a<=m then insert(p*2,l,m,a,b);
end;
function count(p,l,r,a,b:longint):longint;
var
m:longint;
begin
if (l=a)and(r=b) then exit(t[p]);
m:=(l+r) div 2;
if b<=m then count:=count(p*2,l,m,a,b) else
if a>=m+1 then count:=count(p*2+1,m+1,r,a,b) else
count:=count(p*2,l,m,a,m)+count(p*2+1,m+1,r,m+1,b);
end;
begin
readln(n);
readln(m);
for i:=1 to m do
begin
readln(c,j,k);
if c='M' then insert(1,1,n,j,k)
else begin
if j>k then begin s:=j;j:=k;k:=s;end;
writeln(count(1,1,n,j,k));
end;
end;
end.