Cod sursa(job #2955098)

Utilizator LXGALXGA a LXGA Data 16 decembrie 2022 10:41:04
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#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;
}