{$M 65520,0,655360}
program zaidimas_su_kugeliu;
  { 157 u‘davinys }
  const MAX = 10000;   { maksimalus kvadrat‚li— skai‡ius }
        pr = 'KVADR.DAT';
        rz = 'KVADR.REZ';
  type lentele = array [1..MAX] of integer;
       { lentel‚, rodanti per kiek ma‘iausiai ‚jim— galima pasiekti }
       { kiekvien… langel¨ }

procedure zaisti (n: integer; kv: lentele;
                  var eita: lentele);
  var sk: lentele; { ma‘iausias ‚jim— skai‡ius per kur¨ pasiekiamas }
                    { kiekvienas langelis }
      kur, i, j: integer;
      trumpesnis: boolean;
begin
  { keliais ma‘iausiais ‚jimais pasiekiamas kiekvienas langelis }
  sk[1] := 0; eita[1] := 0;
  for i := 2 to n do
    begin
      eita[i] := 0;   { inicializuojame lenteles }
      sk[i] := maxint div 2; { didelis skai‡ius - langelis nepasiektas }
    end;
  trumpesnis := true;
  while trumpesnis do  { kol radome trumpesn¨ keli… }
    begin
      trumpesnis := false;
      for i := 1 to n do  { bandysime eiti i˛ i-tojo langelio }
        if kv[i] <> 0 { jei kvadrat‚lyje yra ne nulis }
        then begin
               { i + kv[i] - ¨ kok¨ langel¨ pakli–sime }
               { sk[i+kv[i]] - kiek ‘ingsni— reik‚jo anks‡iau }
               { sk[i] + kv[i] - kiek ‘ingsni— reikia dabar }
               if i + kv[i] > n { pakli–sime ¨ ˛¨ langel¨ }
                  then kur := n { neverta v‚l eiti ¨ pirmus langelius }
                  else kur := i + kv[i];
               if kur > 0 { i˛ pirmo langelio neiname atgal }
                  then if sk[i] + abs(kv[i]) < sk[kur]
                          then begin
                                 { i˛ paskutinio langelio einame ¨ pirm… }
                                 sk[kur] := sk[i] + abs(kv[i]);
                                 eita[kur] := i;
                                 trumpesnis := true;
                               end
             end
        else { jei i-tame kvadrat‚lyje ¨ra˛ytas nulis }
          for j := 1 to 6 do { metame kauliuk… }
            if i + j <= n { i˛ paskutinio langelio neverta eiti ¨ pirm… }
               then if sk[i] + j < sk[i+j]
                       then begin
                              sk[i+j] := sk[i] + j;
                              eita[i+j] := i;
                              trumpesnis := true;
                             end
    end; { while "trumpesnis" do }
end; { ‘aisti }

procedure skaityk (var n : integer; var kv: lentele);
  var i: integer;
      f: text;
begin
  assign (f, pr);
  reset (f);
  readln (f, n);
  for i := 1 to n do
    readln (f, kv[i]);
  close (f);
end; { skaityk }

procedure rasyk (var kv, eita: lentele; n: integer; var f: text);
{ rekursin‚ proced–ra, spausdinanti rezultatus }
  var i: integer;
begin
  if n > 1
     then if kv[eita[n]] = 0
             then begin
                    rasyk (kv, eita, eita[n], f);
                    writeln (f, n-eita[n]);
                  end
              else rasyk (kv, eita, eita[n], f);
end; { ra˛yk }

  var n: integer;
      kv, eita: lentele;
      f: text;
begin
  skaityk (n, kv);
  if n <= 7 { jei u‘teks vieno metimo }
     then eita[n] := 1
     else zaisti (n, kv, eita);
  { rezultat— spausdinimas }
  assign (f, rz);
  rewrite (f);
  rasyk (kv, eita, n, f);
  close (f);
end.
