Pagini recente » Cod sursa (job #1964693) | Cod sursa (job #845356) | Cod sursa (job #732065) | Cod sursa (job #3344935) | Cod sursa (job #3329682)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("lca.in");ofstream fout("lca.out");
int n,m,i,grad[100005],first[100005],rmq[18][200005],sz,lg[100005],mx,p,x,y,a,b;vector<int>v[100005],euler;
void dfs(int nod,int tata){
euler.push_back(nod);
first[nod]=euler.size()-1;
if(v[nod].size()==1)return;
for(auto x:v[nod]){
if(x==tata)continue;
grad[x]=grad[nod]+1;
dfs(x,nod);
euler.push_back(nod);
}
}
int main()
{
fin>>n>>m;euler.push_back(0);
for(i=2;i<=2*n;i++)lg[i]=lg[i/2]+1;
for(i=2;i<=n;i++){
fin>>x;
v[i].push_back(x);
v[x].push_back(i);
}
grad[1]=1;
dfs(1,0);
sz=euler.size()-1;mx=lg[sz];
for(i=1;i<=sz;i++)rmq[0][i]=euler[i];
for(p=1;p<=mx;p++)
for(i=1;i<=sz-(1<<p)+1;i++){
if(grad[rmq[p-1][i]]<grad[rmq[p-1][i+(1<<(p-1))]])rmq[p][i]=rmq[p-1][i];
else rmq[p][i]=rmq[p-1][i+(1<<(p-1))];
}
for(i=1;i<=sz;i++)cout<<euler[i]<<' ';
for(i=1;i<=m;i++){
fin>>x>>y;
x=first[x];
y=first[y];
if(y<x)swap(x,y);
p=lg[y-x+1];
a=rmq[p][x];
b=rmq[p][y-(1<<p)+1];
if(grad[a]>grad[b])fout<<b;
else fout<<a;
fout<<'\n';
}
return 0;
}