统计和
题目描述
给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区间的和。时间限制1秒。
输入输出格式
输入格式:
第一行1个数,表示序列的长度n
第二行1个数,表示操作的次数w
后面依次是w行,分别表示加入和询问操作
其中,加入用x表示,询问用y表示
x的格式为"x a b" 表示在序列a的位置加上b
y的格式为"y a b" 表示询问a到b区间的加和
输出格式:
每行一个数,分别是每次询问的结果
分析:树状数组模版。
代码
const
maxn=100000;
var
a:array[0..maxn] of longint;
x,y,n,m,i:longint;
ch:char;
procedure insert(x,y:longint);
begin
while x<=n do
begin
inc(a[x],y);
x:=x+x and (-x);
end;
end;
function count(x:longint):longint;
var
s:longint;
begin
s:=0;
while x>0 do
begin
inc(s,a[x]);
x:=x-x and (-x);
end;
exit(s);
end;
begin
readln(n);
readln(m);
for i:=1 to m do
begin
readln(ch,x,y);
if ch='x' then insert(x,y)
else writeln(count(y)-count(x-1));
end;
end.