Pagini recente » Cod sursa (job #246901) | Cod sursa (job #1767617) | Cod sursa (job #3257911) | Cod sursa (job #701953) | Cod sursa (job #2878623)
#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);
}
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";
}
}