Pagini recente » Cod sursa (job #2633470) | Cod sursa (job #3179907) | Cod sursa (job #279654) | Cod sursa (job #790312) | Cod sursa (job #3265973)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
const int NMAX=25e4+5;
int p[NMAX], lift[NMAX][17];
vector<int> adj[NMAX];
void DFS(int u)
{
lift[u][0]=p[u];
for(int i=1;i<=17;i++)
lift[u][i]=lift[lift[u][i-1]][i-1];
for(auto v:adj[u])
DFS(v);
}
int caut_bin(int u, int k)
{
int r=u, pas=17;
while(pas>=0)
{
if(k&(1<<pas))
r=lift[r][pas];
pas--;
}
return r;
}
int main()
{
int n, m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>p[i];
adj[p[i]].push_back(i);
}
DFS(0);
while(m--)
{
int u, k;
cin>>u>>k;
cout<<caut_bin(u, k)<<'\n';
}
return 0;
}