Cod sursa(job #754683)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 2 iunie 2012 21:00:45
Problema Cautare binara Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.7 kb
program cautare_binara;
var f,g:text;
    n,m,i:longint;
    v:array of longint;
    bufin,bufout:array[1..65000] of byte;
    tip:byte;
    valoare,poz:longint;

procedure caut_bin1(st,dr,valoare:longint; var poz:longint);
var mijloc:longint;
begin
 if st=dr then
 begin
  if v[st]=valoare then
   if st>poz then
    poz:=st;
 end
 else
 begin
  mijloc:=(st+dr) div 2;
  caut_bin1 (st,mijloc,valoare,poz);
  caut_bin1(mijloc+1,dr,valoare,poz);
 end;
end;

procedure caut_bin2(st,dr,valoare:longint; var poz:longint);
var mijloc:longint;
begin
 if st=dr then
 begin
  if v[st]<=valoare then
   if st>poz then
    poz:=st;
 end
 else
 begin
  mijloc:=(st+dr) div 2;
  caut_bin2 (st,mijloc,valoare,poz);
  caut_bin2(mijloc+1,dr,valoare,poz);
 end;
end;

procedure caut_bin3 (st,dr,valoare:longint; var poz:longint);
var mijloc:longint;
begin
 if st=dr then
 begin
  if v[st]>=valoare then
   if st<poz then
    poz:=st;
 end
 else
 begin
  mijloc:=(st+dr) div 2;
  caut_bin3 (st,mijloc,valoare,poz);
  caut_bin3 (mijloc+1,dr,valoare,poz);
 end;
end;

begin
 assign (f,'cautbin.in'); reset (f);
 assign (g,'cautbin.out'); rewrite (G);
 settextbuf (f,bufin); settextbuf (g,bufout);
 readln (f,n);
 setlength (V,n+1);
 for i:=1 to n do
  read (f,v[i]);
 readln (f);
 readln (F,m);
 for i:=1 to m do
 begin
  readln (f,tip,valoare);
  if tip=0 then
  begin
   poz:=-1;
   caut_bin1(1,n,valoare,poz);
   writeln (G,poz);
  end
  else
   if tip=1 then
   begin
    poz:=0;
    caut_bin2(1,n,valoare,poz);
    writeln (G,poz);
   end
   else
   begin
    poz:=n+1;
    caut_bin3(1,n,valoare,poz);
    writeln (G,poz);
   end;
 end;
 close (f); close (g);
end.