Pagini recente » Statisticile problemei Taxe | Cod sursa (job #1695277) | Cod sursa (job #420810) | Monitorul de evaluare | Cod sursa (job #3293030)
#include <fstream>
#include<vector>
using namespace std;
#define bsize 20
ifstream cin("lca.in");
ofstream cin("lca.out");
vector<vector<int>> graph;
vector<vector<int>> vparent;
vector<int> depth;
void dfs(int p,int u,int d){
depth[u]=d;
for(int i=2;i<bsize;i++){
vparent[u][i]=vparent[vparent[u][i-1]][i-1];
}
for(auto v:graph[u]){
if(v==p)
continue;
dfs(u,v,d+1);
}
}
int lca(int u,int v){
if(depth[u]<depth[v])
swap(u,v);
int nr=depth[u]-depth[v],i;
for(i=0;i<bsize;i++){
if(nr&(1<<i)){
u=vparent[u][i];
nr-=(1<<i);
}
if(nr==0)
break;
}
if(u==v)
return u;
for(i=bsize-1;i>=0;i--){
if(vparent[u][i]!=vparent[v][i]){
u=vparent[u][i];
v=vparent[v][i];
}
}
return vparent[u][0];
}
int main()
{
int i,j,n,m,u,v;
cin>>n>>m;
graph.resize(n+1);
depth.resize(n+1,0);
vparent = vector<vector<int>>(n+1,vector<int>(bsize,1));
for(i=2;i<=n;i++){
cin>>u;
vparent[i][0]=u;
graph[u].push_back(i);
}
dfs(-1,1,1);
for(i=0;i<m;i++){
cin>>u>>v;
cout<<lca(u,v)<<"\n";
}
return 0;
}