Cod sursa(job #178950)

Utilizator cheery_g1rlHaller Emanuela cheery_g1rl Data 15 aprilie 2008 13:28:14
Problema Arbori indexati binar Scor 20
Compilator fpc Status done
Runda Arhiva educationala Marime 1.64 kb
var c:array[1..100000] of longint;
    i,n,m,x,a,b,d:longint;
procedure adaug(a,b:longint);
    var p:longint;
    begin
      p:=a;
      while p<=n do
        begin
          inc(c[p],b);
          p:=p+(p and(not(p-1)));
        end;
    end;
function calc(x:longint):longint;
     var p,s:longint;
     begin
       p:=x;s:=0;
       while p<>0 do
          begin
            inc(s,c[p]);
            p:=p-(p and(not(p-1)));
          end;
       calc:=s;
    end;
{function min(st,dr,b:longint):longint;
    var p,k:longint;
    begin
      if st>dr then min:=-1
          else
            begin
              p:=(st+dr) div 2;
              k:=calc(p);
              if k>b then min:=min(1,p-1,b);
              if k<b then min:=min(p+1,n,b);
              if k=b then min:=p;
            end;
    end;    }

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); adaug(i,x); end;

for i:=1 to m do
  begin
    read(a);
    if a=0 then
        begin
          read(b,d);
          adaug(b,d);
        end
            else if a=1 then
              begin
                read(b,d);
                writeln(calc(d)-calc(b-1));
              end
                      else
                    begin
                      read(b);
                     { d:=min(1,n,b);
                      writeln(d);}
                      d:=1;
                      while (calc(d)<>b)and(d<n) do inc(d);
                      if calc(d)<>b then writeln('-1') else writeln(d);
                    end;
  end;
close(input);
close(output);
end.