program diskeliu_paskirstymas;
  { 11 u‘davinys }
{----------------------------------------------------------}
  const P_MAX    = 100; { did‘iausias pirk‚j— skai‡ius }
  type duomenys  = record
                     nr,             { pirk‚jo numeris }
                     praso,          { kiek pražo }
                     gauna : integer { kiek gauna }
                   end;
       lentele = array [1..P_MAX] of duomenys;
  procedure diskeliai ( d,  { gaut— diskeli— skai‡ius }
                        p : integer; { pirk‚j— skai‡ius }
                        var C : integer; { skai‡ius C }
                        var dsk : lentele );
    var i, j : integer;
        tarp : duomenys;
  begin
    for i := 1 to p do
      begin
        dsk[i].nr :=  i;
        dsk[i].gauna := 0;
     end;
    {  pagal pražom— diskeli— kiekius did‚jimo tvarka }
    {   surikiuojamas pirk‚j— masyvas }
   for i := 1 to p - 1 do
     for j  :=  1 to p - i do
       if dsk[j].praso > dsk[j + 1].praso
          then  begin
                  tarp :=  dsk[j];
                  dsk[j] :=  dsk[j + 1];
                  dsk[j + 1] := tarp;
                end;
    { dalinami diskeliai }
    for i := 1 to p do
      begin
        c  := d div (p - i + 1);
        if dsk[i].praso <=  c
           then begin
                  dsk[i].gauna := dsk[i].praso;
                  d := d - dsk[i].praso;
                end
           else begin
                  dsk[i].gauna := c;
                  d :=  d - c
                end;
    end;
    c := c -  1;
  end;
{----------------------------------------------------------}
  procedure ivedimas (var d, p : integer; var dsk : lentele);
    var x : integer;
        f : text;
        v : string;
  begin
    write ('­veskite pradini— duomen— bylos vard…: ');
    readln (v);
    assign (f, v);
    reset (f);
    readln (f, d);
    { pirk‚j— skai‡ius ne‘inomas; pradiniai duomenys skaitomi kol
      sutinkamas nulis }
    p := 0;
    readln (f, x);
    while x <> 0 do
      begin
        p := p + 1;
        dsk[p].praso := x;
        readln (f, x);
      end;
    close (f)
  end;
  procedure isvedimas (p, C : integer; dsk : lentele);
    var v : string;
        f : text;
        i : integer;
  begin
    write ('­veskite rezultat— bylos vard…: ');
    readln (v);
    assign (f,  v);
    rewrite (f);
    writeln (f, 'C = ', C);
    for i := 1 to p do
    writeln (f, dsk[i].nr,  ' ',dsk[i].praso,' ',dsk[i].gauna);
    close (f);
  end;
  var p,             { pirk‚j— skai‡ius }
      d,             { gaut— diskeli— kiekis }
      C   : integer; { skai‡ius C }
      dsk : lentele; { pražom— diskeli— kiekiai }
begin
  ivedimas (d, p, dsk);
  diskeliai (d, p, C, dsk);
  isvedimas (p, C, dsk)
end.
