Cod sursa(job #295147)

Utilizator anca.vodaAnca Voda anca.voda Data 3 aprilie 2009 00:08:30
Problema Cautare binara Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 2.82 kb
var f,g:Text;
    j,p,n,c,x,m,i,k:longint;
    a:array[0..10001]of longint;
function caut_bin0(x:longint):longint;
         var s,d,mij:longint;
         begin
              s:=1;d:=n;
              caut_bin0:=-1;
              while (s<=d) do
                    begin
                    mij:=s+(d-s) div 2;
                    if a[mij]=x then
                       if (a[mij+1]>x) then begin caut_bin0:=mij; break end
                          else s:=mij+1
                    else if a[mij]>x then d:=mij-1
                            else s:=mij+1;
                    end;
         end;

function caut_bin1(x:longint):longint;
         var s,d,mij:longint;
         begin
              s:=1;d:=n;
              while (s<=d) do
                    begin
                    mij:=s+(d-s) div 2;
                    if a[mij]=x then
                       if a[mij-1]<x then begin d:=mij;break end
                       else d:=mij-1
                    else if a[mij]>x then d:=mij-1
                            else s:=mij+1;
                    end;
              caut_bin1:=d
         end;

function caut_bin2(x:longint):longint;
         var s,d,mij:longint;
         begin
              s:=1;d:=n;
              while (s<=d) do
                    begin
                    mij:=s+(d-s) div 2;
                    if a[mij]=x then
                       if a[mij+1]>x then begin s:=mij;break end
                          else s:=mij+1
                    else if a[mij]>x then d:=mij-1
                            else s:=mij+1;
                    end;
              caut_bin2:=s
         end;


begin
assign(f,'cautbin.in');reset(f);
assign(g,'cautbin.out');rewrite(g);
readln(f,n);
a[0]:=100001; a[n+1]:=0;
for i:=1 to n do
    begin
       read(f,a[i]);
    end;
readln(f,m);
for i:=1 to m do
    begin
    read(f,c,x);

    case c of
       0: if a[n]=x then writeln(g,n) else writeln(g,caut_bin0(x));
          {if a[p]=x then
            begin
               j:=p;
               while (j+1<=n) and (a[j+1]=x) do inc(j);
               writeln(g,j);
             end
          else writeln(g,-1);}
       1: if a[1]=x then writeln(g,1) else writeln(g,caut_bin1(x));
           { begin
               j:=p;
               while (j-1>=1) and (a[j-1]=x) do dec(j);
               if (a[p]=x) then writeln(g,j)
                  else if j>1 then writeln(g,j-1)
                          else writeln(g,j)
            end;}

       2: if a[n]=x then writeln(g,n) else writeln(g,caut_bin2(x));
          {  begin
               j:=p;
               while (j+1>=1) and (a[j+1]=x) do inc(j);
               if (a[p]=x) then writeln(g,j)
                  else if j<n then writeln(g,j+1)
                          else writeln(g,j+1)
            end }
    end;
    end;
close(g);
end.