Pagini recente » Cod sursa (job #147079) | Cod sursa (job #2238963) | Cod sursa (job #2003944) | Cod sursa (job #919005) | Cod sursa (job #2878633)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m, q, p, aux;
vector<int> G[250005];
vector<int> Anc[250005];
vector<int> roots;
int ancestors[250005];
void dfs(int x, int k)
{
for ( int i = 0; (1 << i) <= k; i++ )
Anc[x].push_back(ancestors[k - (1 << i) + 1]);
ancestors[k + 1] = x;
for ( int a : G[x] )
dfs(a, k + 1);
}
inline int Log2(int x)
{
int a = 0;
x >>= 1;
while ( x )
x >>= 1, a++;
return a;
}
int main()
{
fin >> n >> m;
for ( int i = 1; i <= n; i++ )
{
fin >> q;
if ( q == 0 )
roots.push_back(i);
else
G[q].push_back(i);
}
for ( int root : roots )
dfs(root, 0);
for ( int i = 1; i <= m; i++ )
{
fin >> q >> p;
while ( p )
{
if ( (( int )(log2(p))) >= Anc[q].size() )
{
q = 0;
break;
}
q = Anc[q][(( int )(Log2(p)))];
p -= (1 << ( int )(Log2(p)));
}
fout << q << "\n";
}
}