const MaxN = 10000; var Posloupnost1:array[1..MaxN] of real; Posloupnost2:array[1..MaxN] of real; DelkaPosloupnosti1:integer; DelkaPosloupnosti2:integer; K:integer; Zacatek1,Zacatek2:integer; DelkaIntervalu:integer; Stred1,Stred2:integer; procedure NactiVstup(); var index:integer; begin {V praktické implementaci v lese by tohle již bylo hotovo ...} read(DelkaPosloupnosti1); for index:=1 to DelkaPosloupnosti1 do read(Posloupnost1[index]); read(DelkaPosloupnosti2); for index:=1 to DelkaPosloupnosti2 do read(Posloupnost2[index]); read(K); end; function PorovnejStromy(Strom1,Strom2:integer):boolean; {Vrací true, pokud je strom v první posloupnosti vyšší} begin if (Strom1 > DelkaPosloupnosti1) then PorovnejStromy:=false else if (Strom2 > DelkaPosloupnosti2) then PorovnejStromy:=true else PorovnejStromy:=(Posloupnost1[Strom1] > Posloupnost2[Strom2]); {Nebo jiná implementace porovnávání stromů ...} end; begin NactiVstup(); if (DelkaPosloupnosti1 + DelkaPosloupnosti2 < K) then begin writeln('Takový strom neexistuje.'); {Nemáme ani K stromů ...} end else if DelkaPosloupnosti1 = 0 then writeln(K,'. nejvyšší strom je ',K,'. v druhé posloupnosti.'); else if DelkaPosloupnosti2 = 0 then writeln(K,'. nejvyšší strom je ',K,'. v první posloupnosti.'); {Tím jsme ošetřili speciální případy} else begin if DelkaPosloupnosti1 > K then DelkaPosloupnosti1:=K; if DelkaPosloupnosti2 > K then DelkaPosloupnosti2:=K; {Dál než K-tý prvek, který nás zajímá, nebude. A teď nás čeká nastavení počátečních podmínek} if DelkaPosloupnosti1 = K then begin if DelkaPosloupnosti2 = K then begin Zacatek1:=0; Zacatek2:=0; DelkaIntervalu:=K; end else begin Zacatek1:=K - DelkaPosloupnosti2 - 1; Zacatek2:=0; DelkaIntervalu:=DelkaPosloupnosti2 + 1; end; end else begin if DelkaPosloupnosti2 = K then begin Zacatek1:=0; Zacatek2:=K - DelkaPosloupnosti1 - 1; DelkaIntervalu:=DelkaPosloupnosti1 + 1; end else begin Zacatek1:=K - DelkaPosloupnosti2; Zacatek2:=K - DelkaPosloupnosti1; DelkaIntervalu:=DelkaPosloupnosti1 + DelkaPosloupnosti2 - K + 1; end; end; while DelkaIntervalu > 1 do begin {Nyní začne binární vyhledávání} Stred1:=Zacatek1 + (DelkaIntervalu div 2); Stred2:=Zacatek2 + (DelkaIntervalu div 2); if PorovnejStromy(Stred1,Stred2) then Zacatek1:=Stred1 else Zacatek2:=Stred2; DelkaIntervalu:=(DelkaIntervalu+1) div 2; end; if (Zacatek1 + Zacatek2 = K - 1) then begin {Máme nalezeno $K-1$ stromů, které jsou nejvýše $(K-1)$-ní} if PorovnejStromy(Zacatek1+1,Zacatek2+1) then writeln(K,'. nejvyšší strom je ',Zacatek1+1,'. v první posloupnosti.') else writeln(K,'. nejvyšší strom je ',Zacatek2+1,'. v druhé posloupnosti.'); end else begin {Nebo $K$ stromů, které jsou nejvýše $K$-té} if PorovnejStromy(Zacatek1,Zacatek2) then writeln(K,'. nejvyšší strom je ',Zacatek2,'. v druhé posloupnosti.') else writeln(K,'. nejvyšší strom je ',Zacatek1,'. v první posloupnosti.'); end; end; end.