Pagini recente » Cod sursa (job #1453044) | Cod sursa (job #415980) | Monitorul de evaluare | Cod sursa (job #2214840) | Cod sursa (job #2806446)
#include <bits/stdc++.h>
#define NMax 250000
#define LogMax 18
using namespace std;
ifstream fin ( "stramosi.in" );
ofstream fout ( "stramosi.out" );
int n, m;
int u, v, k;
int p, q;
int x;
vector<int> adj[NMax + 1], str;
int d[LogMax + 1][NMax + 1];
void query ( int q, int p )
{
if ( p > n )
{
fout << 0 << '\n';
return;
}
for ( int i = LogMax; i >= 0; i-- )
if ( p & (1 << i) )
q = d[i][q];
fout << q << '\n';
}
void dfs ( int x, int p)
{
for ( auto v: adj[x] )
if ( v != p )
{
d[k][v] = d[k - 1][d[k - 1][v]];
dfs(v, x);
}
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
fin >> n >> m;
for ( int i = 1; i <= n; i++ )
{
fin >> x;
if ( x != 0 )
{
d[0][i] = x;
adj[x].push_back(i);
//adj[i].push_back(x);
}
if ( x == 0 ) str.push_back(i);
}
for ( auto x: str )
{
k = 1;
for ( int i = 1; (1 << i) <= n && i <= LogMax; i++ )
{
dfs(x, x);
k++;
}
}
//fout << d[1][5];
for ( int i = 1; i <= m; i++ )
{
fin >> q >> p;
query(q, p);
}
return 0;
}