Cod sursa(job #178103)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 14 aprilie 2008 08:26:07
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.41 kb
program datorii;
var A : array [1..45000] of integer;
    B : array [1..15000] of integer;
    S,i,n,m,p1,p2 : longint;
    f,g : text;
    x : shortint;
function max(a,b:longint):longint;
begin
if a>b then max := a
        else max := b;
end;

procedure creare(nod,l,r:longint);
var mij : longint;
begin
if r=l then A[nod] := B[l]
else begin
     mij := (l+r) div 2;
     creare(2*nod,l,mij);
     creare(2*nod+1,mij+1,r);
     A[nod] := A[2*nod]+A[2*nod+1];
     end;
end;

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

procedure query(nod,l,r:longint);
var mij : longint;
begin
if (p1<=l) and (r<=p2) then S := S+A[nod]
else begin
        mij := (l+r) div 2;
        if p1<=mij then query(2*nod,l,mij);
        if mij<p2 then query(2*nod+1,mij+1,r);
        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
read(f,B[i]);

creare(1,1,n);
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.