题目描述:
给出N个数,M个操作。操作分两种1、C(x,y) 表示把第x个数改成y 2、Q(x,y)表示询问第x个数到第y个数的和是多少。
输入:第一行,一个N(1<=n<=20000)表示有多少个数。第二行有N个数(0<=ai<=10000)。然后一个数M(1<M<=50000)表示有多少个操作。然后下面有M行,分别有以上所述的两种操作。
输出:你只要对Q操作进行输出就可以了。
Program Number_Mpq;
Const Maxn=20000;
var
i,x,y,n,m:longint;
a:array[1..Maxn] of longint;
sum:array[1..Maxn] of longint;
lowbit:array[1..Maxn] of longint;
procedure add(p,d:longint);
begin
while p<=n do
begin
inc(sum[p],d);
p:=p+lowbit[p];
end;
end;
function sigma(p:longint):longint;
begin
sigma:=0;
while p>0 do
begin
inc(sigma,sum[p]);
dec(p,lowbit[p]);
end;
exit(sigma);
end;
procedure init;
var
i:integer;
begin
readln(n);
for i:=1 to n do
lowbit[i]:=i and (i xor (i-1));
for i:=1 to n do
begin
read(a[i]);
add(i,a[i]);
end;
readln;
end;
procedure Main;
var
ch:char;
i,x,y:longint;
begin
readln(m);
for i:=1 to m do
begin
read(ch);
if ch='C' then
begin
readln(x,y);
Add(x,y-a[x]);
a[x]:=y;
end else
begin
readln(x,y);
writeln(sigma(y)-sigma(x-1));
end;
end;
end;
begin
assign(input,'Number.in'); reset(input);
assign(output,'Number.out'); rewrite(output);
init;
Main;
close(input); close(output);
end.