PROGRAM Mobilizer;
 USES CRT;
 CONST maxn=100;
 TYPE Mobil=RECORD
             n: INTEGER;
             il,ir,xl,xr,s: ARRAY[1..maxn] OF INTEGER;
            END;
 VAR vstup: TEXT;
     mb1: Mobil;
     m1:INTEGER;
{Nacteni mobilu ze souboru}
 PROCEDURE CtiMobil(VAR mb:Mobil;VAR f:TEXT);
  VAR i,u,ku,nku,nu:INTEGER;
 BEGIN
  WITH mb DO BEGIN
   n:=1; i:=1; ku:=1; nku:=1; nu:=0;
   WHILE NOT(EOF(f)) DO BEGIN
     READLN(f,u,s[i],xl[i],xr[i]);
     IF u=ku THEN BEGIN
               nku:=pred(nku);
             END
             ELSE IF (u=ku+1) AND (nku=0) THEN BEGIN
                                            ku:=u;
                                            nku:=nu-1;
                                            nu:=0
                                          END
                  ELSE WRITELN('Spatny vstupni soubor ',u,xl[i],xr[i]);
     IF xl[i]=0 THEN BEGIN
                 ir[i]:=0; il[i]:=0;
                END
                ELSE BEGIN
                 n:=succ(n); il[i]:=n;
                 n:=succ(n); ir[i]:=n;
                 nu:=nu+2
                END;
     i:=succ(i)
   END;
   IF i<>n+1 THEN WRITELN('Spatny vstupni soubor');
  END
 END;

{Zjisti,zda je podmobil s korenem i vyvazeny, m udava hmotnost podmobilu}
 FUNCTION Vyvazeny(VAR mb:Mobil; i:INTEGER; VAR m:INTEGER):BOOLEAN;
  VAR ml,mr: INTEGER;
      vv: BOOLEAN;
 BEGIN
  WITH mb DO
    IF xl[i]=0 THEN BEGIN
                Vyvazeny:=TRUE;
                m:=xr[i]
               END
               ELSE BEGIN
                vv:=Vyvazeny(mb,il[i],ml);
                vv:=vv AND Vyvazeny(mb,ir[i],mr);
                m:=ml+mr;
                vv:=vv AND (ml*xr[i]=mr*xl[i])
               END
 END;

 {Nakresli snuru delky d, zacinajici na x,y}
 PROCEDURE Snura(x,y,d: INTEGER);
  VAR iy:INTEGER;
 BEGIN
  GOTOXY(x,y); WRITE('.');
  FOR iy:=y+1 TO y+d-1 DO BEGIN
    GOTOXY(x,iy);
    WRITE('!');
  END
 END;
 {Nakresli pricky}
 PROCEDURE Lpricka(x,y,d: INTEGER);
  VAR ix:INTEGER;
 BEGIN
  GOTOXY(x,y); WRITE('.');
  FOR ix:=x-1 DOWNTO x-d+1 DO BEGIN
    GOTOXY(ix,y);
    WRITE('-');
  END;
 END;
 PROCEDURE Rpricka(x,y,d: INTEGER);
  VAR ix:INTEGER;
 BEGIN
  FOR ix:=x+1 TO x+d-1 DO BEGIN
    GOTOXY(ix,y);
    WRITE('-');
  END;
 END;
{Nakresli podmobil na pozici x,y}
 PROCEDURE PisMobil(VAR mb:Mobil; i,x,y:INTEGER);
 BEGIN
   WITH mb DO BEGIN
     Snura(x,y,s[i]);
     IF (xl[i]=0) THEN BEGIN
                    GOTOXY(x,y+s[i]);
                    WRITE(xr[i]);
                  END
                  ELSE BEGIN
                    Lpricka(x,y+s[i],xl[i]);
                    PisMobil(mb,il[i],x-xl[i],y+s[i]);
                    Rpricka(x,y+s[i],xr[i]);
                    PisMobil(mb,ir[i],x+xr[i],y+s[i]);
                  END;
   END;
 END;

BEGIN
  CLRSCR;
  ASSIGN(vstup,'mobil1.txt');
  RESET(vstup);
  CtiMobil(mb1,vstup);
  IF Vyvazeny(mb1,1,m1) THEN WRITELN('Mobil je vyvazeny')
                        ELSE WRITELN('Mobil neni vyvazeny');
  WRITELN('Celkova hmotnost mobilu je ',m1);
  READLN;
  CLRSCR;
  PisMobil(mb1,1,35,2);
  READLN;
END.