Cod sursa(job #59761)

Utilizator h_istvanHevele Istvan h_istvan Data 10 mai 2007 12:25:47
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.62 kb
program datorii;
var f,fout:text;
    n,m,i,t,a,b:longint;
    h:array[1..300000] of longint;

procedure berak(n,k,v,p,e:longint);
var m:longint;
begin
     if (k=v) then
     begin
          h[n]:=h[n]+e;
     end else
     begin
          m:=(k+v) div 2;
          if(p <= m) then berak(n*2,k,m,p,e)
                     else berak(n*2+1,m+1,v,p,e);
          h[n]:=h[n]+e;
     end;
end;

procedure kivesz(n,k,v,p,e:longint);
var m:longint;
begin
     if (k=v) then
     begin
          h[n]:=h[n]-e;
     end else
     begin
          m:=(k+v) div 2;
          if(p <= m) then kivesz(n*2,k,m,p,e)
                     else kivesz(n*2+1,m+1,v,p,e);
          h[n]:=h[n]-e;
     end;
end;

function lekerdez(n,k,v,a,b:longint):longint;
var e,m:longint;
begin
     if (a<=k) and (v<=b) then
     begin
          e:=h[n];
          lekerdez:=e;
     end else
     begin
          e:=0;
          m:=(k+v) div 2;
          if(a <= m) then e:=e+lekerdez(2*n,k,m,a,b);
          if(b > m) then e:=e+lekerdez(2*n+1,m+1,v,a,b);
          lekerdez:=e;
     end;
end;

begin
     assign(f,'datorii.in');
     assign(fout,'datorii.out');
     reset(f);
     rewrite(fout);
     readln(f,n,m);
     for i:= 1 to n do
     begin
          read(f,t);
          berak(1,1,n,i,t);
     end;
     readln(f);
     for i:=1 to m do
     begin
          readln(f,t,a,b);
          if(t=0) then
          begin
               kivesz(1,1,n,a,b);
          end else
          begin
               writeln(fout,lekerdez(1,1,n,a,b));
          end;
     end;
     close(f);
     close(fout);
end.