Pagini recente » Cod sursa (job #1931886) | Cod sursa (job #2165140) | Cod sursa (job #2794699) | Cod sursa (job #2356055) | Cod sursa (job #568360)
Cod sursa(job #568360)
#include <fstream>
using namespace std;
#define DN 250005
#define DLGN 19
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
int N, logN, M, P, Q, T[DN][DLGN], D1[DN], D2[DN], R[DN], I[DN];
int cmp(int a, int b)
{
return T[a][0] > T[b][0];
}
void prep1()
{
for (int i = 2; i <= N; i++)
{
D1[i] = D1[i>>1] + 1;
D2[i] = D2[(i+1)>>1] + 1;
}
}
void prep2()
{
sort (I + 1, I + N + 1, cmp);
int i, k;
for (k = 2; k <= logN; k++)
for (i = 1; i <= N; i++)
{
if (T[I[i]][0] < k)
break;
T[I[i]][k] = T[T[I[i]][k-1]][k-1];
}
}
int main()
{
fi >> N >> M;
prep1();
for (int i = 1; i <= N; i++)
{
fi >> T[i][1];
R[i] = R[T[i][1]] + 1;
T[i][0] = D2[R[i]];
if (T[i][0] > logN)
logN = T[i][0];
I[i] = i;
}
prep2();
for (int i = 0; i < M; i++)
{
fi >> Q >> P;
while (P != 0)
{
Q = T[Q][D1[P]+1];
P -= 1 << D1[P];
}
fo << Q << '\n';
}
}