Cod sursa(job #1558825)

Utilizator laura.calimanLaura Caliman laura.caliman Data 29 decembrie 2015 17:04:39
Problema Datorii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.25 kb
var a,b,c,n,m,i:longint;
    v:array[1..15000] of longint;
    d:array[1..45000] of longint;
    
procedure creare(nod,st,dr:longint);
var m:longint;
begin
  if st=dr then 
    d[nod]:=v[st]
  else begin
    m:=(st+dr) div 2;
    creare(nod*2,st,m);
    creare(nod*2+1,m+1,dr);
    d[nod]:=d[nod*2]+d[nod*2+1];
  end;
end;

function interogare(nod,st,dr,a,b:longint):longint;
var m,k,p:longint;
begin
  if (a<=st) and (dr<=b) then 
    interogare:=d[nod]
  else begin
    m:=(st+dr) div 2;
    k:=0; p:=0;
    if a<=m then k:=interogare(nod*2,st,m,a,b);
    if b>m then p:=interogare(nod*2+1,m+1,dr,a,b);
    interogare:=k+p;
  end;
end;

procedure actualizare(nod,st,dr,a,b:longint);
var  m:longint;
begin
  if (a=st) and (a=dr) then 
    d[nod]:=d[nod]-b
  else begin
    m:=(st+dr) div 2;
    if a<=m then actualizare(nod*2,st,m,a,b)
    else actualizare(nod*2+1,m+1,dr,a,b);
    d[nod]:=d[nod*2]+d[nod*2+1];
  end;
end;
    
begin
  assign(input,'datorii.in');
  assign(output,'datorii.out');
  reset(input);
  rewrite(output);
  read(n,m);
  for i:=1 to n do read(v[i]);
  creare(1,1,n);
  for i:=1 to m do begin
    read(c,a,b);
    if c=0 then actualizare(1,1,n,a,b)
    else writeln(interogare(1,1,n,a,b));
  end;
end.