Cod sursa(job #45918)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 2 aprilie 2007 06:54:58
Problema Mese Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.29 kb
{
    Problema mese
}

Program mese;

Type ref = ^elm;
     elm = record
            nod : Longint;
            adr : ref;
           end;

Var l : array[0..100000] of ref;
    varsta : array[0..100000] of ^byte;
    e, f : ref;
    n, s, i, t, m : Longint;
    sum : Integer;

Procedure df( nod : Longint; Var suma : Integer );
Var e, f : ref;
    ss, s2 : Integer;
Begin
    e := l[nod];
    s2 := varsta[nod]^;
    While e <> nil do
        Begin
            df( e^.nod, ss );
            s2 := s2 + ss;
            if s2 > s then
                Begin
                    s2 := s2 -ss;
                    m := m+1;
                    if e = l[nod] then
                        Begin
                            l[nod] := l[nod]^.adr;
                            dispose( e );
                            e := l[nod];
                        End
                        else
                        Begin
                            f^.adr := e^.adr;
                            dispose( e );
                            e := f^.adr;
                        End;
                End
                else
                Begin
                    f := e;
                    e := e^.adr;
                End;
        End;
    suma := s2;
End;

Begin

    { Init stuff }
    Assign( input, 'mese.in' );
    Reset( input );
        Readln( n, s );
        For i := 0 to n do
            Begin
                l[i] := nil;
                new( varsta[i] );
            End;
        varsta[0]^ := 0;
        For i := 1 to n do
            Begin
                Readln( t, varsta[i]^ );
                new( e );
                e^.nod := i;
                e^.adr := l[t];
                l[t] := e;
            End;
    Close( input );
    m := 1;  { prima componenta va avea <= s }

    { *** Solving *** }
    df( 0, sum );

    { Writing stuff }
    Assign( output, 'mese.out' );
    Rewrite( output );
        Writeln( m );
    Close( output );

    { Ending stuff }
    For i := 0 to n do
        Begin
            dispose( varsta[i] );
            While l[i] <> nil do
                Begin
                    e := l[i];
                    l[i] := l[i]^.adr;
                    dispose( e );
                End;
        End;

End.