program espias_100;
var
n, i, j, k, espiaActual, apuntadorPila, largociclo, maximo : integer;
esCiclo : boolean;
espias : array [1..1000000] of integer;
leidos : array [1..1000000] of integer;
leidosDesdeEspia : array [1..1000000] of integer;
pila : array [1..1000001] of integer;
begin
readln(n);
for i:=1 to n do begin
readln(espias[i]);
leidos[i]:=0;
leidosDesdeEspia[i]:=0;
end;
maximo:=0;
apuntadorPila:=1;
j:=1; // VAMOS A UTILIZAR j PARA IR NUMERANDO LOS CICLOS Y NO CONFUNDIRNOS ENTRE EL CICLO QUE ESTAMOS BUSCANDO Y ANTERIORES
// OBTEN LOS MAXIMOS EMPEZANDO DESDE TODOS LOS ESPIAS
for i:=1 to n do begin
if leidos[i] = 0 then begin // NO SE HA PASADO POR ESTE ESPIA NUNCA
espiaActual:=i;
while leidos[espiaActual] = 0 do begin // RECORRE DESDE ESTE ESPIA HASTA ENCONRAR SU CICLO O CHOCAR CON UN CICLO ENCONTRADO PREVIAMENTE
leidos[espiaActual]:=j;
pila[apuntadorPila]:=espiaActual;
Inc(apuntadorPila);
espiaActual:=espias[espiaActual];
end;
if leidos[espiaActual] = j then begin // ENCONTRAMOS UN CICLO, HAY QUE MEDIR LA LONGITUD
largoCiclo:=0;
for k:=apuntadorPila - 1 downto 1 do begin // BUSCA EL LARGO DEL CICLO
if pila[k] = espiaActual then
break
else
Inc(largoCiclo);
end;
// ACTUALIZA LOS MAXIMOS, TODOS LOS ELEMENTOS DEL CICLO DEBEN TENER EL MISMO VALOR
esCiclo:=true;
while apuntadorPila > 1 do begin
Dec(apuntadorPila);
if esCiclo then
leidosDesdeEspia[pila[apuntadorPila]]:=largoCiclo
else
leidosDesdeEspia[pila[apuntadorPila]]:=leidosDesdeEspia[espias[pila[apuntadorPila]]] + 1;
if pila[apuntadorPila] = espiaActual then esCiclo:=false;
end;
end
else begin // SOMOS UNA RAMA, LLEGAMOS A UN CICLO O RAMA PREVIA, HAY QUE ACTUALIZAR LAS LONGITUDES
while apuntadorPila > 1 do begin
Dec(apuntadorPila);
leidosDesdeEspia[pila[apuntadorPila]]:=leidosDesdeEspia[espias[pila[apuntadorPila]]] + 1;
end;
end;
end;
Inc(j);
end;
// BUSCA EL MAXIMO
for i:=1 to n do
if leidosDesdeEspia[i] > maximo then
maximo:=leidosDesdeEspia[i];
write(maximo);
end.
cHJvZ3JhbSBlc3BpYXNfMTAwOwoKdmFyCiAgIG4sIGksIGosIGssIGVzcGlhQWN0dWFsLCBhcHVudGFkb3JQaWxhLCBsYXJnb2NpY2xvLCBtYXhpbW8gOiBpbnRlZ2VyOwogICBlc0NpY2xvIDogYm9vbGVhbjsKICAgZXNwaWFzIDogYXJyYXkgWzEuLjEwMDAwMDBdIG9mIGludGVnZXI7CiAgIGxlaWRvcyA6IGFycmF5IFsxLi4xMDAwMDAwXSBvZiBpbnRlZ2VyOwogICBsZWlkb3NEZXNkZUVzcGlhIDogYXJyYXkgWzEuLjEwMDAwMDBdIG9mIGludGVnZXI7CiAgIHBpbGEgOiBhcnJheSBbMS4uMTAwMDAwMV0gb2YgIGludGVnZXI7CgpiZWdpbgogICAgIHJlYWRsbihuKTsKICAgICBmb3IgaTo9MSB0byBuIGRvIGJlZ2luCiAgICAgICAgIHJlYWRsbihlc3BpYXNbaV0pOwogICAgICAgICBsZWlkb3NbaV06PTA7CiAgICAgICAgIGxlaWRvc0Rlc2RlRXNwaWFbaV06PTA7CiAgICAgZW5kOwoKICAgICBtYXhpbW86PTA7CiAgICAgYXB1bnRhZG9yUGlsYTo9MTsKICAgICBqOj0xOyAvLyBWQU1PUyBBIFVUSUxJWkFSIGogUEFSQSBJUiBOVU1FUkFORE8gTE9TIENJQ0xPUyBZIE5PIENPTkZVTkRJUk5PUyBFTlRSRSBFTCBDSUNMTyBRVUUgRVNUQU1PUyBCVVNDQU5ETyBZIEFOVEVSSU9SRVMKICAgICAvLyBPQlRFTiBMT1MgTUFYSU1PUyBFTVBFWkFORE8gREVTREUgVE9ET1MgTE9TIEVTUElBUwogICAgIGZvciBpOj0xIHRvIG4gZG8gYmVnaW4KICAgICAgICAgaWYgbGVpZG9zW2ldID0gMCB0aGVuIGJlZ2luIC8vIE5PIFNFIEhBIFBBU0FETyBQT1IgRVNURSBFU1BJQSBOVU5DQQogICAgICAgICAgICBlc3BpYUFjdHVhbDo9aTsKICAgICAgICAgICAgd2hpbGUgbGVpZG9zW2VzcGlhQWN0dWFsXSA9IDAgZG8gYmVnaW4gLy8gUkVDT1JSRSBERVNERSBFU1RFIEVTUElBIEhBU1RBIEVOQ09OUkFSIFNVIENJQ0xPIE8gQ0hPQ0FSIENPTiBVTiBDSUNMTyBFTkNPTlRSQURPIFBSRVZJQU1FTlRFCiAgICAgICAgICAgICAgICAgIGxlaWRvc1tlc3BpYUFjdHVhbF06PWo7CiAgICAgICAgICAgICAgICAgIHBpbGFbYXB1bnRhZG9yUGlsYV06PWVzcGlhQWN0dWFsOwogICAgICAgICAgICAgICAgICBJbmMoYXB1bnRhZG9yUGlsYSk7CiAgICAgICAgICAgICAgICAgIGVzcGlhQWN0dWFsOj1lc3BpYXNbZXNwaWFBY3R1YWxdOwogICAgICAgICAgICBlbmQ7CgogICAgICAgICAgICBpZiBsZWlkb3NbZXNwaWFBY3R1YWxdID0gaiB0aGVuIGJlZ2luIC8vIEVOQ09OVFJBTU9TIFVOIENJQ0xPLCBIQVkgUVVFIE1FRElSIExBIExPTkdJVFVECiAgICAgICAgICAgICAgIGxhcmdvQ2ljbG86PTA7CiAgICAgICAgICAgICAgIGZvciBrOj1hcHVudGFkb3JQaWxhIC0gMSBkb3dudG8gMSBkbyBiZWdpbiAvLyBCVVNDQSBFTCBMQVJHTyBERUwgQ0lDTE8KICAgICAgICAgICAgICAgICAgIGlmIHBpbGFba10gPSBlc3BpYUFjdHVhbCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgIEluYyhsYXJnb0NpY2xvKTsKICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICAgICAvLyBBQ1RVQUxJWkEgTE9TIE1BWElNT1MsIFRPRE9TIExPUyBFTEVNRU5UT1MgREVMIENJQ0xPIERFQkVOIFRFTkVSIEVMIE1JU01PIFZBTE9SCiAgICAgICAgICAgICAgIGVzQ2ljbG86PXRydWU7CiAgICAgICAgICAgICAgIHdoaWxlIGFwdW50YWRvclBpbGEgPiAxIGRvIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgIERlYyhhcHVudGFkb3JQaWxhKTsKICAgICAgICAgICAgICAgICAgICAgaWYgZXNDaWNsbyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGxlaWRvc0Rlc2RlRXNwaWFbcGlsYVthcHVudGFkb3JQaWxhXV06PWxhcmdvQ2ljbG8KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgbGVpZG9zRGVzZGVFc3BpYVtwaWxhW2FwdW50YWRvclBpbGFdXTo9bGVpZG9zRGVzZGVFc3BpYVtlc3BpYXNbcGlsYVthcHVudGFkb3JQaWxhXV1dICsgMTsKCiAgICAgICAgICAgICAgICAgICAgIGlmIHBpbGFbYXB1bnRhZG9yUGlsYV0gPSBlc3BpYUFjdHVhbCB0aGVuIGVzQ2ljbG86PWZhbHNlOwogICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbHNlIGJlZ2luIC8vIFNPTU9TIFVOQSBSQU1BLCBMTEVHQU1PUyBBIFVOIENJQ0xPIE8gUkFNQSBQUkVWSUEsIEhBWSBRVUUgQUNUVUFMSVpBUiBMQVMgTE9OR0lUVURFUwogICAgICAgICAgICAgICAgIHdoaWxlIGFwdW50YWRvclBpbGEgPiAxIGRvIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgRGVjKGFwdW50YWRvclBpbGEpOwogICAgICAgICAgICAgICAgICAgICAgIGxlaWRvc0Rlc2RlRXNwaWFbcGlsYVthcHVudGFkb3JQaWxhXV06PWxlaWRvc0Rlc2RlRXNwaWFbZXNwaWFzW3BpbGFbYXB1bnRhZG9yUGlsYV1dXSArIDE7CiAgICAgICAgICAgICAgICAgZW5kOwogICAgICAgICAgICBlbmQ7CiAgICAgICAgIGVuZDsKICAgICAgICAgSW5jKGopOwogICAgIGVuZDsKCiAgICAgLy8gQlVTQ0EgRUwgTUFYSU1PCiAgICAgZm9yIGk6PTEgdG8gbiBkbwogICAgICAgICBpZiBsZWlkb3NEZXNkZUVzcGlhW2ldID4gbWF4aW1vIHRoZW4KICAgICAgICAgICAgbWF4aW1vOj1sZWlkb3NEZXNkZUVzcGlhW2ldOwoKICAgICB3cml0ZShtYXhpbW8pOwplbmQuCg==