Cod sursa(job #1507198)

Utilizator ili226Vlad Ilie ili226 Data 21 octombrie 2015 15:41:28
Problema Cautare binara Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.85 kb
{
Se da un sir de numere ordonat crescator cu N elemente, si se cere sa se raspunda la M intrebari de tipul:
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic
numar al sirului este mai mic sau egal decat x
2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare
 numar din sir este mai mare sau egal decat x
}
var a:array[1..100{003}]of longint;
    n,m,i,x,rez:longint;
    tip:byte;
    f,fo:text;

procedure cbin(tip:byte;st,dr,x:longint;var r:longint);
var m:longint;
begin
 if st<dr then
  begin
   m:=st+(dr-st)div 2;
   case tip of
    0:begin
       if a[m]<x then
        cbin(tip,st,m,x,r)
                 else
        begin
         if a[m]=x then r:=m;
         cbin(tip,m+1,dr,x,r);
        end;
      end;
    1:begin
       if a[m]<=x then
        begin
         r:=m;
         cbin(tip,m+1,dr,x,r)
        end
                  else
        begin
         cbin(tip,st,m,x,r);
        end;
      end;
    2:begin
       if a[m]>=x then
        begin
         r:=m;
         cbin(tip,st,m,x,r);
        end
                  else
        begin
         cbin(tip,m+1,dr,x,r);
        end;
      end;
   end;
  end
          else
  begin
   case tip of
    0:if a[dr]=x then r:=dr;
    1:if a[dr]<x then r:=dr;
    2:if a[dr]>x then r:=dr;
   end;
  end;
end;

begin
assign(f,'cautbin.in');
assign(fo,'cautbin.out');
reset(f);
readln(f,n);
for i:=1 to n do
 read(f,a[i]);
readln(f);
readln(f,m);
rewrite(fo);
for i:=1 to m do
 begin
  readln(f,tip,x);rez:=-1;
  cbin(tip,1,n,x,rez);
  writeln(fo,rez);
 end;
close(fo);
close(f);
end.