Cod sursa(job #48147)

Utilizator andrei_infoMirestean Andrei andrei_info Data 4 aprilie 2007 14:04:28
Problema Mese Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.05 kb
//campion mese

type pnod = ^tnod;
     tnod = record
                x:longint;
                next:pnod;
                end;

var n,s,rad,rez,nrfii:longint;
    tata,sum:array[0..100003] of longint;
    varsta:array[1..100000] of byte;
    arb:array[1..100000] of pnod;
    sumfii: array[1..100000] of longint;

procedure addlist(nod,fiu:longint);
var p:pnod;
begin
new(p); p^.x:=fiu; p^.next:=arb[nod];
arb[nod]:=p;
end;

procedure citire;
var i,tat,v:longint;
begin
assign(input,'mese.in'); reset(input);
readln(n,s);
for i:=1 to n do
        begin
        readln(tat,v);
        addlist(tat,i);
        tata[i]:=tat;
        if tat = 0 then rad:=i;
        varsta[i]:=v;
        end;
closE(input);
end;

procedure df(nod : longint);
var p:pnod;
begin
if sum[nod] <> 0 then exit;
p:=arb[nod]; sum[nod]:=varsta[nod];
while p <> nil do
        begin
        df(p^.x);
        sum[nod]:=sum[nod]+sum[p^.x];
        p:=p^.next;
        end;
end;

procedure Sort(l, r: longint);
var
  i, j, x,y : longint;

begin
  i := l; j := r; x := sumfii[(l+r) DIV 2];
  repeat
    while sumfii[i] < x do i := i + 1;
    while x < sumfii[j] do j := j - 1;
    if i <= j then
    begin
      y := sumfii[i]; sumfii[i] := sumfii[j]; sumfii[j] := y;
      i := i + 1; j := j - 1;
    end;
  until i > j;
  if l < j then Sort(l, j);
  if i < r then Sort(i, r);
end;


procedure df2(nod:longint);
var p:pnod;
begin
p:=arb[nod];
sum[nod]:=varsta[nod];
while p <> nil do
        begin
        df2(p^.x);
        sum[nod]:=sum[nod]+sum[p^.x];
        p:=p^.next;
        end;
p:=arb[nod]; nrfii:=0;
while p <> nil do
        begin
        inc(nrfii);
        sumfii[nrfii]:=sum[p^.x];
        p:=p^.next;
        end;
if nrfii > 0 then
begin
sort(1,nrfii);
while sum[nod] > s do
        begin
        sum[nod]:=sum[nod] - sumfii[nrfii];
        dec(nrfii);
        inc(rez);
        end;
end;
end;

begin
citire;
//df(rad);
df2(rad);
assign(output,'mese.out'); rewrite(output);
writeln(rez+1);
close(output);
end.