Pagini recente » Cod sursa (job #31924) | Cod sursa (job #31974) | Cod sursa (job #1243921) | Cod sursa (job #3296460) | Cod sursa (job #3296516)
#include<fstream>
#include<vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int N=1e5;
vector<int> b[N];
int a[N][17],c[N],d[N],e[N];
int main()
{
int m,n;
cin>>n>>m,e[0]=1;
for(int i=1;i<n;cin>>c[i],b[--c[i]].push_back(i),++i);
for(int i=0,j=1;i<j;++i)
for(int k:b[d[i]])
if(!e[k])
e[k]=e[d[i]]+1,d[j++]=k;
for(int i=0;i<n;++i)
for(int j=0;1<<j<n;a[i][j++]=-1);
for(int i=0;i<n;a[i][0]=c[i],++i);
for(int j=1;1<<j<n;++j)
for(int i=0;i<n;++i)
if(a[i][j-1]!=-1)
a[i][j]=a[a[i][j-1]][j-1];
for(;m--;) {
int i,j,l;
if(cin>>i>>j,--i,--j,e[i]<e[j])
swap(i,j);
for(l=1;1<<l<=e[i];++l);
for(int k=--l;k>=0;--k)
if(e[i]-e[j]>=1<<k)
i=a[i][k];
if(i==j)
cout<<i+1<<'\n';
else {
for(int k=l;k>=0;--k)
if(a[i][k]!=-1&&a[i][k]!=a[j][k])
i=a[i][k],j=a[j][k];
cout<<1+c[i]<<'\n';
}
}
return 0;
}