#include <iostream>
#include <cstring>
using namespace std;
struct diak
{
int tovaad;
int maxhossz=0;
};
void KiirDiak(diak *a, int len)
{
cout << endl;
for (int i=1; i<len; i++) {
cout << "{"<< a[i].tovaad <<", "<< a[i].maxhossz << "}";
if (i<len)
cout << ", ";
}
cout << endl;
}
void ResetSzamolas(bool *szamolt, int len) {
memset(szamolt,0,(len+1)*sizeof(bool));
}
void MaximizeLoop(diak *a, int epos, int pos, int maxhossz)
{
if (epos != pos) {
a[pos].maxhossz = maxhossz;
MaximizeLoop(a,epos,a[pos].tovaad,maxhossz);
}
}
bool IsLoopStartPos(int len, diak* a, bool *szamolt, int pos)
{ int cpos = pos;
do {
szamolt[cpos] = true;
cpos = a[cpos].tovaad;
} while (!szamolt[cpos]);
return (cpos == pos);
}
void EqualizeLoop(int len, diak* a, bool *szamolt, int spos)
{ if (IsLoopStartPos(len, a, szamolt,spos)) {
// cout << "Kor:" << spos << endl;
MaximizeLoop(a, spos, a[spos].tovaad, a[spos].maxhossz);
} else {
ResetSzamolas(szamolt,len);
// cout << "Lepjel:" << a[spos].tovaad << endl;
EqualizeLoop(len, a, szamolt, a[spos].tovaad);
}
}
int lanchossz (int len, diak *a, bool *szamolt, int pos)
{
if (a[pos].maxhossz) {
// cout << endl;
return a[pos].maxhossz;
}
if (!szamolt[pos]) {
szamolt[pos] = true;
// cout << pos << "->" << a[pos].maxhossz << ", ";
a[pos].maxhossz = lanchossz (len, a, szamolt, a[pos].tovaad) + 1;
// cout << pos << "->" << a[pos].maxhossz << ", ";
}
return a[pos].maxhossz;
}
void hirmax (diak *a, int len)
{ int i,pos,maxh=0;
for (i=1; i<len; i++) {
if (a[i].maxhossz>maxh) {
maxh=a[i].maxhossz;
pos=i;
}
}
cout<<pos<<" "<<maxh<<endl;
}
int main()
{
int N;
/**/
cin>>N;
diak a[N+1];
for (int i=1; i<=N; i++)
{
cin>>a[i].tovaad;
}
/*/
N = 11;
diak a[N+1] = { {0,0}, {3,0}, {1,0}, {2,0}, {3,0}, {2,0}, {5,0}, {6,0}, {5,0}, {10,0}, {11,0}, {10,0} };
/**/
bool szamolt[N+1];
// KiirDiak(a, N);
for (int i=1; i<=N; i++) {
if (a[i].maxhossz == 0) {
// cout << endl << "Elem:" << i << endl;
ResetSzamolas(szamolt,N);
lanchossz(N+1, a, szamolt, i);
ResetSzamolas(szamolt,N);
// cout << endl;
EqualizeLoop(N+1, a, szamolt, i);
// KiirDiak(a, N+1);
// cout << endl;
}
}
hirmax(a,N+1);
return 0;
}