Family tree of bob

 avatar
unknown
c_cpp
a year ago
1.2 kB
6
Indexable
#include<bits/stdc++.h>
 
using namespace std;
 
#define ll long long
 
int highestSetBit(int n){
	int cnt=0;
	while(n!=0){
		n/=2;
		cnt++;
	}
	return cnt-1;
}
 
void dfs(int u, int par, vector< vector<int> > &g, vector<bool> &visited, vector< vector<int> > &parent){
	visited[u]=true;
 
	parent[u][0]=par;
 
	for(int i=1;i<20;i++){
		parent[u][i]=parent[parent[u][i-1]][i-1];
	}
 
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
 
		if(!visited[v]){
			dfs(v,u,g,visited,parent);
		}
	}
	return;
}
 
void solve()
{
	int n,q;
	cin>>n>>q;
 
	vector< vector<int> > g(n+1, vector<int>() );
	vector<bool> visited(n+1, false);
 
	for(int i=0;i<n-1;i++){
		int u,v;
		cin>>u>>v;
 
		g[u].push_back(v);
    	g[v].push_back(u);
	}
 
	vector<vector<int> > parent(n+1, vector<int> (20, 0));
 
	for(int i=0;i<n+1;i++){
		for(int j=0;j<20;j++){
			parent[i][j]=0;
		}
	}
 
	dfs(1,0,g,visited,parent);
 
	while(q--){
		int u,k;
		cin>>u>>k;
 
		while(k!=0){
			int hsb=highestSetBit(k);
			u=parent[u][hsb];
			k=k-(1<<hsb);
		}
 
		if(u==0)
			u=-1;
 
		cout<<u<<endl;
	}
 
	return;
}
 
int main()
{
    #ifndef ONLINE_JUDGE
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	#endif
 
    solve();
 
    
    return 0;
}
Language
Editor is loading...
Leave a Comment