Cod sursa(job #367638)

Utilizator philipPhilip philip Data 22 noiembrie 2009 23:24:27
Problema Arbori indexati binar Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.5 kb
var op,y,i,n,x,ind,m,s1,s2,mij:longint;
    a:array[0..100004] of longint;

begin
  assign(input,'aib.in');
  reset(input);
  assign(output,'aib.out');
  rewrite(output);
  readln(n,m);
  for i:=1 to n do begin
        read(x);
        ind:=i;
        while ind<=n do begin
                a[ind]:=a[ind]+x;
                ind:=ind+(-ind and ind);
        end;
  end;

  for i:=1 to m do begin
    read(op);
    if op=0 then begin
        readln(ind,x);
        while ind<=n do begin
                a[ind]:=a[ind]+x;
                ind:=ind+(-ind and ind);
        end;
    end;

    if op=1 then begin
        s1:=0;
        s2:=0;
        readln(x,y);
        dec(x);
        while x>0 do begin
                s1:=s1+a[x];
                x:=x-(-x and x);
        end;
        while y>0 do begin
                s2:=s2+a[y];
                y:=y-(-y and y);
        end;
        writeln(s2-s1);
    end;

    if op=2 then begin
        s2:=0;
        readln(s1);
        mij:=-1;
        x:=1;
        y:=n;
        while (x<=y) and (s1<>s2) do begin
          s2:=0;
          mij:=(x+y) div 2;
          ind:=mij;
          while ind>0 do begin
                s2:=s2+a[ind];
                ind:=ind-(-ind and ind);
          end;
          if s1>s2 then begin
            x:=mij+1;
          end else if s1<s2 then
            y:=mij-1;
        end;
        if s1=s2 then writeln(mij) else writeln(-1);
    end;
  end;

  close(input);
  close(output);
end.