program Bonsaj; { Obousměrný spojový seznam } type odksez = ^sez; sez = record vlevo: odksez; vpravo: odksez; listku: Integer; end; type smer = (Doleva, Doprava); procedure zpracuj(predchozi: odksez; s: smer); { Rekurzivní zpracování rozdvojek bonsaje: predchozi je předchozí rozdvojka, s je směr, ve kterém se koukáme. } var pocet: Integer; var novy: odksez; begin; read(pocet); if pocet <> -1 then begin; if( s = Doleva) then begin; if predchozi^.vlevo = nil then begin; { Díváme se doleva, ale vlevo prvek spojového seznamu chybí. } new(novy); novy^.vpravo := predchozi; predchozi^.vlevo := novy; end else novy := predchozi^.vlevo; end else begin; if predchozi^.vpravo = nil then begin; new(novy); novy^.vlevo := predchozi; predchozi^.vpravo := novy; end else novy := predchozi^.vpravo; end; novy^.listku := novy^.listku + pocet; zpracuj(novy, Doleva); zpracuj(novy, Doprava); end; end; var pocet: Integer; var koren: odksez; var pocatek: odksez; begin; { Zpracuj vstup, kořen zvlášť. } read(pocet); if(pocet <> -1) then begin; new(koren); koren^.listku := pocet; zpracuj(koren, Doleva); zpracuj(koren, Doprava); { Přejdi na nejlevější prvek seznamu. } pocatek := koren; while pocatek^.vlevo <> nil do pocatek := pocatek^.vlevo; { Vypiš. } while(pocatek <> nil) do begin; write(pocatek^.listku); write(' '); pocatek := pocatek^.vpravo; end; end; end.