Pagini recente » Cod sursa (job #3356705) | Monitorul de evaluare | Borderou de evaluare (job #3319888) | Cod sursa (job #3344255) | Cod sursa (job #3348729)
#include <bits/stdc++.h>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
const int NMAX = 250001, LOGMAX = 17;
int anc[NMAX][LOGMAX + 1];
vector <int> adj[NMAX];
vector <int> roots;
void dfs ( int nod )
{
for ( int i = 1; i <= LOGMAX && anc[nod][i - 1] > 0; i ++ )
anc[nod][i] = anc[anc[nod][i - 1]][i - 1];
for ( auto it : adj[nod] )
dfs ( it );
}
int query ( int nod, int exp )
{
for ( int i = LOGMAX; i >= 0; i -- )
{
if ( ( 1 << i ) <= exp )
{
nod = anc[nod][i];
exp -= ( 1 << i );
}
}
return nod;
}
int main()
{
int n, q, x;
f >> n >> q;
for ( int i = 1; i <= n; i ++ )
{
f >> x;
anc[i][0] = x;
adj[x].push_back(i);
if ( x == 0 )
roots.push_back(i);
}
for ( auto it : roots )
dfs ( it );
while ( q -- )
{
int nod, grad;
f >> nod >> grad;
g << query ( nod, grad ) << '\n';
}
return 0;
}