Cod sursa(job #1180309)

Utilizator azkabancont-vechi azkaban Data 30 aprilie 2014 14:56:01
Problema Cautare binara Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 2.65 kb
Program binary;
var n,i,r,b,t,j,x,poz,min,max : longint;
    a : array [1..100000] of longint;
    b1,b2  :array [0..1 shl 17] of char;

procedure cauta_min(nr: longint);
var pivot,left,right : longint;
   begin
        right:=n; left:=1;
        repeat
              pivot:=(left+right) div 2;
              if nr>=A[pivot] then begin
                                   min:=pivot;
                                   left:=pivot+1;
                              end
                         else
              if nr<A[pivot] then right:=pivot-1
        until left>right;
   end;

procedure cauta(nr: longint);
var pivot,left,right : longint;
   begin
        right:=n; left:=1;
        poz:=0;
        repeat
              pivot:=(left+right)div 2;
              if nr=A[pivot] then begin
                                   poz:=pivot;
                                   left:=pivot+1;
                              end
                         else
              if nr<A[pivot] then right:=pivot-1
                            else left:=pivot+1;
        until left>right;
   end;

procedure cauta_max(nr: longint);
var pivot,left,right : longint;
   begin
        right:=n; left:=1;
        repeat
              pivot:=(left+right) div 2;
              if nr<=A[pivot] then begin
                                        max:=pivot;
                                        right:=pivot-1;
                                     end
                               else
              if nr>A[pivot] then left:=pivot+1;
        until left>right;
   end;






begin
   assign(input,'cautbin.in'); settextbuf(input,b1); reset(input);
   assign(output,'cautbin.out'); settextbuf(output,b2); rewrite(output);
   readln(n);
   for i:=1 to n do read(A[i]);
   readln(t);
   for j:=1 to t do begin
                         readln(r,b) ;
                         case r of
                                 0 : begin
                                          cauta(b);
                                          if poz<>0 then writeln(poz)
                                                    else writeln(-1);
                                     end;
                                 1 : begin
                                         cauta_min(b);
                                         writeln(min);
                                      end;
                                 2  : begin
                                          cauta_max(b);
                                          writeln(max);
                                      end;
                                 end;

   end;


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