Pagini recente » Cod sursa (job #3243298) | Cod sursa (job #276262) | Cod sursa (job #2919766) | Cod sursa (job #2044827) | Cod sursa (job #2469001)
//#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> v[100005];
int q[200005],cnt=0,f[100005],lvl[200005],n,m,a,rmq[200005][20];
void dfs(int nod,int niv){
q[++cnt]=nod;
if(f[nod]==0){
f[nod]=cnt;
//cout<<"{"<<nod<<" "<<cnt<<"}";
}
lvl[cnt]=niv;
for(int i=0;i<v[nod].size();i++){
dfs(v[nod][i],niv+1);
q[++cnt]=nod;
lvl[cnt]=niv;
}
}
int log(long long x)
{
return 64 - __builtin_clzll(x) - 1;
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
cin>>n>>m;
for(int i=2;i<=n;i++){
cin>>a;
v[a].push_back(i);
}
dfs(1,0);
//cout<<"\n";
//for(int i=1;i<=cnt;i++){
//cout<<q[i]<<" ";
//}
//cout<<"\n";
for(int i=1;i<=cnt;i++){
//cout<<lvl[i]<<" ";
rmq[i][0]=i;
}
//cout<<"\n\n";
for(int j=1;(1<<j)<=cnt;j++){
for(int i=1;i+(1<<j)<=cnt;i++){
if(lvl[rmq[i][j-1]]<lvl[rmq[i+(1<<(j-1))][j-1]]){
rmq[i][j]=rmq[i][j-1];
}
else{
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
}
}
//for(int i=1;i<=cnt;i++){
//for(int j=0;(1<<j)<=cnt and i+(1<<j)-1<=cnt;j++){
//cout<<rmq[i][j]<<" ";
//}
//cout<<"\n";
//}
//cout<<"\n\n\n\n\n";
int a,b,dist;
for(int i=1;i<=m;i++){
cin>>a>>b;
a=f[a];
b=f[b];
//cout<<a<<" "<<b<<" ";
dist=b-a+1;
dist=log(dist);
//cout<<dist<<"-=-=";
if(lvl[rmq[a][dist]]<lvl[rmq[b-(1<<dist)+1][dist]]){
cout<<rmq[a][dist]<<"--"<<q[rmq[a][dist]]<<"\n";
}
else{
cout<<rmq[b-(1<<dist)+1][dist]<<"--"<<q[rmq[b-(1<<dist)+1][dist]]<<"\n";
}
}
return 0;
}
///1 2 4 7 4 8 4 2 5 2 6 9 6 2 1 3 10 3 11 3 1