program  z;
    const  maxN=10000;


var f : text;
    N,Kiek : integer;
    numeriai : array[1..maxN] of integer;


procedure skaitome;
   var i:integer;
begin
 assign(f,'ZETON.DAT');
 reset(f);
 readln(f,N);

 for i:=1 to N do
   readln(f,numeriai[i]);
  

 close(f);
end;


procedure rasome;

begin
 assign(f,'ZETON.REZ');
 rewrite(f);
 writeln(f,Kiek);
 close(f);
end;


function GautiDidCikloDydi:integer;

 var pirmas,kitas,prev,ilgis,maxilgis,i : integer;

begin

 maxilgis:=1;

 i:=1;
 while i<=N do
  begin
   while (i<=N) and (numeriai[i]=0) do inc(i);

   if i > N then break;

   pirmas:=i;
   kitas:=numeriai[i];
   ilgis:=1;
   prev:=i;

   while kitas<>pirmas do
    begin
//     prev:=kitas;
     numeriai[prev]:=0;
     prev:=kitas;
     kitas:=numeriai[kitas];
     inc(ilgis);
    end;
   if kitas=pirmas then numeriai[prev]:=0;
   if ilgis>maxilgis then maxilgis:=ilgis;
   inc(i);

  end;

  GautiDidCikloDydi:=maxilgis;


end;


procedure GautiKiek;
 var k:integer;
 begin
  k:=GautiDidCikloDydi;
  kiek:=0;
  while k>1 do
   begin

     k:=k div 2 + k mod 2;
     inc(kiek);

   end;

 end;


begin
 Skaitome;
 GautiKiek;
 Rasome;
end.
