Cod sursa(job #195660)

Utilizator 05_YohnE1 La5c01 05_Yohn Data 20 iunie 2008 15:31:37
Problema Cautare binara Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 2.7 kb
program caut;
var f,g:text;
    v:array[1..100000]of longint;
    n,m,i,elem,rasp:longint;
    int:byte;
procedure zero(elem:longint;var rasp:longint);
var st,dr:longint;
    ok:boolean;
begin
ok:=false;
st:=1;dr:=n;
while not ok do begin
      if elem>=v[(st+dr)div 2] then st:=(st+dr) div 2
                               else dr:=(st+dr) div 2;
      if elem=v[st] then begin while v[st]=elem do st:=st+1;
                               ok:=true;
                               rasp:=st-1;
                               end;
      if elem=v[dr] then begin while v[dr]=elem do dr:=dr+1;
                               ok:=true;
                               rasp:=dr-1;
                               end;
      if (st=dr)and(not ok) then begin
                                rasp:=-1;
                                ok:=true;
                                end;
end;
end;
procedure doi(elem:longint;var rasp:longint);
var st,dr:longint;
    ok:boolean;
begin
ok:=false;
st:=1;dr:=n;
while not ok do begin
      if elem>=v[(st+dr)div 2] then st:=(st+dr) div 2
                               else dr:=(st+dr) div 2;
      if elem=v[st] then begin while v[st]=elem do st:=st+1;
                               ok:=true;
                               rasp:=st;
                               end;
      if elem=v[dr] then begin while v[dr]=elem do dr:=dr+1;
                               ok:=true;
                               rasp:=dr;
                               end;
      if st=dr then begin
                    rasp:=st+1;
                    ok:=true;
                    end;
end;
end;
procedure unu(elem:longint;var rasp:longint);
var st,dr:longint;
    ok:boolean;
begin
ok:=false;
st:=1;dr:=n;
while not ok do begin
      if elem>=v[(st+dr)div 2] then st:=(st+dr) div 2
                               else dr:=(st+dr) div 2;
      if elem=v[st] then begin while v[st]=elem do st:=st-1;
                               ok:=true;
                               rasp:=st;
                               end;
      if elem=v[dr] then begin while v[dr]=elem do dr:=dr-1;
                               ok:=true;
                               rasp:=dr;
                               end;
      if st=dr then begin
                    rasp:=st;
                    ok:=true;
                    end;
end;
end;
begin
assign(f,'cautbin.in');
assign(g,'cautbin.out');
reset(f);rewrite(g);
readln(f,n);
for i:=1 to n do read(f,v[i]);
readln(f);
readln(f,m);
for i:=1 to m do begin
    readln(f,int,elem);
    if int=0 then zero(elem,rasp)
             else if int=1 then unu(elem,rasp)
                           else doi(elem,rasp);
    writeln(g,rasp);
end;
end.