Cod sursa(job #1185032)

Utilizator maierraulMaier Raul maierraul Data 14 mai 2014 21:18:30
Problema Cautare binara Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.69 kb
program binco;
var s:array[1..100000] of longword; n,m,i,key:longword; f,g:text; ind:byte;

function caut0(st,dr,key:longword):longint;
var mid:word;
begin
if st>dr then caut0:=-1
else begin
        mid:=(st+dr) div 2;
        if s[mid]=key then
                begin
                if caut0(mid+1,dr,key)>-1 then caut0:=caut0(mid+1,dr,key)
                else caut0:=mid;
                end
        else if (key<s[mid]) then caut0:=caut0(st,mid-1,key)
        else caut0:=caut0(mid+1,dr,key)
        end;
end;

function caut1(st,dr,key:longword):longword;
var mid:word;
begin
if st>dr then caut1:=0
else begin
        mid:=(st+dr) div 2;
        if s[mid]<=key then
                begin
                caut1:=mid;
                if caut1(mid+1,dr,key)>mid then caut1:=caut1(mid+1,dr,key);
                end
        else caut1:=caut1(st,mid-1,key);
        end
end;

function caut2(st,dr,key:longword):longword;
var mid:word;  loc:longword;
begin
if st>dr then caut2:=0
else begin
        mid:=(st+dr) div 2;
        if s[mid]>=key then
                begin
                caut2:=mid;
                loc:=caut2(st,mid-1,key);
                if (loc<mid) and (loc>0) then caut2:=caut2(st,mid-1,key)
                end
        else caut2:=caut2(mid+1,dr,key);
        end
end;

begin
assign(f,'cautbin.in'); reset(f);
assign(g,'cautbin.out'); rewrite(g);
readln(f,n);
for i:=1 to n do
        read(f,s[i]);
readln(f,m);
for i:=1 to m do
        begin
        readln(f,ind,key);
        if ind=0 then writeln(g,caut0(1,n,key))
        else if ind=1 then writeln(g,caut1(1,n,key))
        else writeln(g,caut2(1,n,key));
        end;
close(f); close(g);
end.