Cod sursa(job #176080)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 10 aprilie 2008 18:25:36
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.32 kb
program datorii;
var A : array [1..45000] of longint;
    i,j,n : word;
    S,p1,p2,m : longint;
    x : byte;
    f,g : text;

procedure add(nod,x,y,val,poz:word);
var mij : longint;
begin
if x=y then A[nod] := val
else begin
     mij := (x+y) div 2;
     if poz<=mij then add(2*nod,x,mij,val,poz)
                 else add(2*nod+1,mij+1,y,val,poz);

     A[nod] := A[2*nod]+A[2*nod+1];

     end;
end;

procedure query(nod,x,y:word);
var mij : longint;
begin
if (p1<=x) and (y<=p2) then S := S+A[nod]
else begin
        mij := (x+y) div 2;
        if p1<=mij then query(2*nod,x,mij);
        if mij<p2 then query(2*nod+1,mij+1,y);
        end;
end;

procedure update(nod,x,y:word);
var mij : longint;
begin
if x=y then A[nod] := A[nod]-p2
else begin
     mij := (x+y) div 2;
     if p1<=mij then update(2*nod,x,mij)
                else update(2*nod+1,mij+1,y);
     A[nod] := A[2*nod]+A[2*nod+1];
     end;
end;


begin
assign(f,'datorii.in');
reset(f);
assign(g,'datorii.out');
rewrite(g);

readln(f,n,m);

for i := 1 to n do begin
read(f,p1);
add(1,1,n,p1,i);
end;
readln(f);

for i := 1 to m do begin
readln(f,x,p1,p2);
if x=1 then begin
            S := 0;
            query(1,1,n);
            writeln(g,S);
            end
else update(1,1,n);
end;

close(f);
close(g);

end.