Program MERGE; {jako SOUB02.pas} type COSI = integer; {typ klicove promenne, napr. ciselny, string, .. } var N, PO, K : word; {N - pocet vet ve zdrojovem souboru M} {PO - rozdeleni do souboru F1 a F2 po PO-ticich} {K - udava velikost PO-tice posledniho rozdeleni M} M, F1, F2 : text; Procedure ROZDEL(FPO:word); var SK, I : word; A : COSI; Procedure SKUP2(var FM:text; var FF:text); var J:byte; begin for J:=1 to FPO do begin Readln(FM,A); Writeln(FF,A) end; end; begin reset(M); rewrite(F1); rewrite(F2); SK:=N div FPO; for I:=1 to SK div 2 do begin SKUP2(M,F1); SKUP2(M,F2); end; if odd(N div FPO) then begin SKUP2(M,F1); while not eof(M) do begin Readln(M,A); Writeln(F2,A) end end else while not eof(M) do begin Readln(M,A); Writeln(F1,A) end; close(M); close(F1); close(F2); end; Procedure SPOJ(FPO:word); var SK, I, POM : word; A, B : COSI; Procedure SKUP1(FPO1,FPO2:word); var PF1, PF2 : word; begin PF1:=1; Readln(F1,A); PF2:=1; Readln(F2,B); while (PF1<=FPO1) and (PF2<=FPO2) do if AFPO1 then while PF2<=FPO2 do begin Writeln(M,B); PF2:=PF2+1; if PF2<=FPO2 then Readln(F2,B) end else while PF1<=FPO1 do begin Writeln(M,A); PF1:=PF1+1; if PF1<=FPO1 then Readln(F1,A) end; end; begin rewrite(M); reset(F1); reset(F2); SK:=N div (FPO*2); for I:=1 to SK do SKUP1(FPO,FPO); if (N-SK*(2*FPO))>FPO then begin POM:=N-SK*2*FPO-FPO; SKUP1(FPO,POM) end else while not eof(F1) do begin Readln(F1,A); Writeln(M,A); end; close(M); close(F1); close(F2); end; begin assign(M,'ZDROJ.TXT'); reset(M); assign(F1,'CAST1.TXT'); assign(F2,'CAST2.TXT'); N:=0; {Nejprve zjistime pocet vet N v souboru M} while not eof(M) do begin Readln(M); N:=N+1 end; close(M); PO:=1; while N>PO do PO:=PO*2; K:=PO div 2; {K - velikost skupiny pri poslednim rozdeleni souboru M} PO :=1; {pro PO=1,2,4 ... K} repeat ROZDEL(PO); SPOJ(PO); PO:=PO*2 until PO>K; end.