Cod sursa(job #196663)

Utilizator theratmantheratman theratman Data 27 iunie 2008 20:54:38
Problema Cautare binara Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.16 kb
 var f,g:text;
     a:array[1..100000]of longint;
     x,op,poz,c,st,dr,n,m,i:longint;
 begin
 assign(f,'cautbin.in');reset(f);
 assign(g,'cautbin.out');rewrite(g);
 read(f,n);
 for i:=1 to n do read(f,a[i]);
 read(f,m);
 for i:=1 to m do begin
  read(f,op,x);
  if op=0 then begin
   poz:=0;
   st:=1;
   dr:=n;
   while (st<=dr)and(poz<>0)do begin
    c:=(st+dr)div 2;
    if x>a[c] then st:=c+1;
    if x<a[c] then dr:=c-1;
    if x=a[c] then poz:=c;
   end;
   c:=(st+dr) div 2;
   if poz<>0 then
    while x=a[poz+1] do inc(poz);
   if poz<>0 then writeln(g,poz)
    else writeln(g,'-1');
  end;
  if op=1 then begin
   poz:=0;
   st:=1;
   dr:=n;
   while (st<=dr)and(poz<>0) do begin
   c:=(st+dr) div 2;
    if x<a[c] then dr:=c-1;
   if x>a[c] then st:=st-1;
    if x=a[c] then poz:=c;
  end;
  c:=(st+dr) div 2;
  writeln(g,c);
  end;
  if op=2 then begin
   poz:=0;
   st:=1;
  dr:=n;
   while (st<=dr)and(poz<>0) do begin
    c:=(st+dr) div 2;
    if x<a[c] then dr:=c-1;
    if x>a[c] then st:=st-1;
    if x=a[c] then poz:=c;
  end;
  c:=(st+dr) div 2;
  writeln(g,c+1);
  end;
 end;
 close(f);
 close(g);
 end.