Pagini recente » Cod sursa (job #1692539) | Cod sursa (job #3214443) | Cod sursa (job #687108) | Cod sursa (job #2580996) | Cod sursa (job #3242101)
#include <bits/stdc++.h>
const std :: string FILENAME = "stramosi";
std :: ifstream in (FILENAME + ".in");
std :: ofstream out (FILENAME + ".out");
const int NMAX = 25e4 + 5;
int n;
int m;
int p;
int q;
int parent[NMAX];
int jump[NMAX];
int depth[NMAX];
std :: vector <int> v[NMAX];
void dfs(int nod)
{
for(int i : v[nod])
{
depth[i] = depth[nod] + 1;
if(depth[nod] - depth[jump[nod]] == depth[jump[nod]] - depth[jump[jump[nod]]])
{
jump[i] = jump[jump[nod]];
}
else
{
jump[i] = nod;
}
dfs(i);
}
}
inline int f(int nod, int stramos)
{
int d = depth[nod] - stramos;
if(d < 0)
{
return 0;
}
while(depth[nod] != d)
{
if(depth[jump[nod]] >= d)
{
nod = jump[nod];
}
else
{
nod = parent[nod];
}
}
return nod;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i ++)
{
in >> parent[i];
v[parent[i]].push_back(i);
}
for(int i = 1; i <= n; i ++)
{
if(parent[i] == 0)
{
jump[i] = i;
dfs(i);
}
}
while(m --)
{
in >> q >> p;
out << f(q, p) << '\n';
}
return 0;
}