Pagini recente » Cod sursa (job #771624) | Cod sursa (job #2718031) | Cod sursa (job #894180) | Cod sursa (job #2146998) | Cod sursa (job #2955098)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
int n,a,b,m;
vector<int> g[250001],r;
const int l=17;
int tin[250001],tout[250001],timer,up[250001][20];
void dfs(int nod,int p)
{
tin[nod]=++timer;
up[nod][0]=p;
for(int i=1;i<=l;i++)
up[nod][i]=up[up[nod][i-1]][i-1];
for(auto i:g[nod])
{
if(i!=p)
dfs(i,nod);
}
tout[nod]=++timer;
}
bool isancest(int u,int v)
{
return tin[u]<=tin[v] && tout[u]>=tout[v];
}
int lca(int u,int v)
{
if(isancest(u,v))
return u;
if(isancest(v,u))
return v;
for(int i=l;i>=0;i--)
{
if(!isancest(up[u][i],v))
u=up[u][i];
}
return up[u][0];
}
int main()
{
ios_base::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a==0)
r.push_back(i);
else
g[a].push_back(i);
}
for(auto i:r)
dfs(i,0);
for(int i=1;i<=m;i++)
{
cin>>a>>b;
//cout<<lca(a,b)<<'\n';
for(int i=l;i>=0;i--)
{
if(((1<<i)&b))
a=up[a][i];
}
cout<<a<<'\n';
}
//cout<<up[5][1];
return 0;
}