Cod sursa(job #1180304)

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

procedure swap(var x,y : longint);
var aux : longint;
 begin
    aux:=x;
    x:=y;
    y:=aux;
 end;

procedure qsort(left, right : longint);
var i,j, pivot : longint;
  begin
     i:=left; j:=right; pivot:=A[(left+right)div 2];
     repeat
        while A[i]<pivot do i:=i+1;
        while A[j]>pivot do j:=j-1;
        if i<=j then begin
                         swap(A[i],A[j]);
                         i:=i+1;
                         j:=j-1;
                     end;
        until i>j;
      if i<right then qsort(i,right);
      if j>left then qsort(left,j);
     end;

procedure cauta_min(nr: longint);
var pivot,left,right : longint;
   begin
        right:=n; left:=1;
        repeat
              pivot:=left+(right-left) 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;
        repeat
              pivot:=left+(right-left) 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-left) 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'); reset(input);
   assign(output,'cautbin.out'); rewrite(output);
   readln(n);
   for i:=1 to n do read(A[i]);
   qsort(1,n);
   readln(t);
   for j:=1 to t do begin
                         readln(r,b) ;
                         case r of
                                 0 : begin
                                          cauta(b);
                                          writeln(poz);
                                     end;
                                 1 : begin
                                         cauta_min(b);
                                         writeln(min);
                                      end;
                                 2  : begin
                                          cauta_max(b);
                                          writeln(max);
                                      end;
                                 end;

   end;


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