Cod sursa(job #294937)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 2 aprilie 2009 20:54:12
Problema Cautare binara Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.36 kb
var f,g:Text;
    n,c,x,m,i,k,p:longint;
    a,b:array[1..100000]of longint;
function caut_bin(x:longint):longint;
         var s,d,mij:int64;
         begin
              s:=1;d:=n;k:=0;
              while (s<=d) do
                    begin
                    mij:=(s+d) div 2;
                    if a[mij]=x then begin s:=mij; break end
                       else if a[mij]>x then d:=mij-1
                            else s:=mij+1;
                    {if (c=0)and(a[mij]=x)then begin
                                              writeln(g,mij);
                                              break;
                                              end
                    else if (c=1)and(a[mij]<x)then begin
                                                   writeln(g,mij);
                                                   break;
                                                   end
                    else if (c=2)and(a[mij]>x)then begin
                                                   writeln(g,mij);
                                                   break;
                                                   end
                    else if c=0 then begin
                                     if a[mij]<x then s:=mij+1
                                     else d:=mij-1;
                                     end
                    else if c=1 then begin
                                     d:=mij-1;
                                     end
                    else if c=2 then begin
                                     s:=mij+1;
                                     end; }
                    end;
              caut_bin:=s
         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,a[i]);}
read(f,a[1]); b[1]:=1; k:=1;
for i:=2 to n do
    begin
       read(f,x);
       if x<>a[k] then begin k:=k+1; a[k]:=x; b[k]:=i end
    end;
readln(f,m);
for i:=1 to m do
    begin
    read(f,c,x);
    p:=caut_bin(x);
    case c of
       0: if a[p]=x then if p=k then writeln(g,n)
                            else writeln(g,b[p+1]-1)
             else writeln(g,-1);
       1: if a[p]=x then writeln(g,b[p])
             else writeln(g,b[p]-1);
       2: if a[p]=x then writeln(g,b[p])
             else writeln(g,b[p+1]-1)
    end;
    end;
close(g);
end.