Cod sursa(job #50778)
Utilizator | Data | 8 aprilie 2007 20:03:47 | |
---|---|---|---|
Problema | Datorii | Scor | 0 |
Compilator | fpc | Status | done |
Runda | Arhiva de probleme | Marime | 2.36 kb |
program tribute_to_mars;
type vect=array[1..15000] of longint;
var f,g:text;
c:vect;
n,m,ad,i,poz,st,bit,q,prod,x,a,b,sum1,sum2:longint;
begin
assign(f,'datorii.in'); reset(f);
assign(g,'datorii.out'); rewrite(g);
read(f,n,m);
for i:=1 to n do begin
read(f,ad);
poz:=i;
st:=0;
prod:=1;
while poz<=n do begin
c[poz]:=c[poz]+ad;
bit:=(poz and (poz-1)) xor poz;
dec(bit);
for q:=st+1 to bit do prod:=prod*2;
st:=bit;
poz:=poz+prod;
end;
end;
for i:=1 to m do begin
read(f,x,a,b);
if x=1 then begin
sum1:=0;
poz:=b;
st:=0;
prod:=1;
while poz>0 do begin
sum1:=sum1+c[poz];
bit:=(poz and (poz-1)) xor poz;
dec(bit);
for q:=st+1 to bit do prod:=prod*2;
st:=bit;
poz:=poz-prod;
end;
sum2:=0;
poz:=a-1;
st:=0;
prod:=1;
while poz>0 do begin
sum2:=sum2+c[poz];
bit:=(poz and (poz-1)) xor poz;
dec(bit);
for q:=st+1 to bit do prod:=prod*2;
st:=bit;
poz:=poz-prod;
end;
writeln(g,sum1-sum2);
end
else begin
ad:=-b;
poz:=a;
st:=0;
prod:=1;
while poz<=n do begin
c[poz]:=c[poz]+ad;
bit:=(poz and (poz-1)) xor poz;
dec(bit);
for q:=st+1 to bit do prod:=prod*2;
st:=bit;
poz:=poz+prod;
end;
end;
end;
close(f); close(g);
end.