题目大意:
给出有N个数的序列a[1],a[2]……,a[n-1],a[n],以及M个操作,每次操作【K,X,Y】:
K=1,第x个数+y
K=2,求区间[X,Y]的总和。
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
题解:
树状数组:
lowbit(i)=i and (-i)
1.给第i个数的c[i]加上a[i],c[j]也要加上a[i],c[k]也要加上a[i],一直到总数大于N。
(j=i+lowbit(i) ; k=j+lowbit(j))
2.查询的时候,要计算总和,就要计算sum[y]-sum[x-1],这时候ans=∑c[j-lowbit(j)]
—— i>=j>=1 ——
var
f:array [0..1000001] of longint;
i,k,x,y,n,m:longint;
procedure insert(p,q:longint);
begin
while p<=n do
begin
f[p]:=f[p]+q;
p:=p+(p and (-p));
end;
end;
function count(c:longint):longint;
begin
count:=0;
while c>0 do
begin
count:=count+f[c];
c:=c-(c and (-c));
end;
exit(count);
end;
begin
readln(n,m);
for i:=1 to n do
begin
read(x);
insert(i,x);
end;
for i:=1 to m do
begin
readln(k,x,y);
if k=1 then insert(x,y)
else writeln(count(y)-count(x-1));
end;
end.