Family tree of bob
unknown
c_cpp
2 years ago
1.2 kB
16
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;
}
LanguageEditor is loading...
Leave a Comment