Cod sursa(job #680279)

Utilizator promix2012petruta andrei promix2012 Data 15 februarie 2012 11:50:51
Problema Arbori indexati binar Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.33 kb
program arbori_indexati_binar;
const fi='aib.in';
       fo='aib.out';
var v:array[1..100000] of longint;
   bufin,bufout:array[1..65000] of byte;
   n, m, i, j, c, x, y, k, sum1, sum2:longint;
   f,g:text;
procedure ad(a,b:longint);
var nrz:longint;
begin
v[a]:=v[a]+b;
nrz:=(a xor (a-1))and a;
if a+nrz<=n then
ad(a+nrz,b);
end;
procedure sum(a:longint; var s:longint);
var nrz:longint;
begin
s:=s+v[a];
nrz:=(a xor (a-1))and a;
if a-nrz>0 then
sum(a-nrz,s);
end;
procedure cautbin(a,b:longint);

var m,su:longint;
begin
if a<=b then
  begin
  m:=(a+b) div 2;
  su:=0;
  sum(m,su);
  if x<=su then
    begin
    if x=su then k:=m;
    cautbin(a,m-1)
    end
    else
    begin
    cautbin(m+1,b);
    end;
    end;
    end;
begin


assign(f,fi);
reset(f);
settextbuf(f,bufin);
assign(g,fo);
rewrite(g);
settextbuf(g,bufout);
read(f,n,m);
for i:=1 to n do
   begin
   read(f,x);
   ad(i,x);
   end;
for i:=1 to m do
  begin
  read(f,c);
  case c of
  1:begin
     readln(f,x,y);
     sum1:=0;
     sum2:=0;
     if x<>1 then sum(x-1,sum1);
     sum(y,sum2);
     writeln(g,sum2-sum1);
     end;
  0:begin
      readln(f,x,y);
      ad(x,y);
      end;
  2:begin
  readln(f,x);
  k:=-1;
  cautbin(1,n);
  writeln(g,k);
  end;
  end;
  end;
  close(f);
  close(g);




end.