Pagini recente » Cod sursa (job #650992) | Cod sursa (job #745275) | Cod sursa (job #1771197) | Cod sursa (job #1575443) | Cod sursa (job #3122576)
#include<bits/stdc++.h>
using namespace std;
ifstream F("lca.in");
ofstream G("lca.out");
vector<int> v[100000];
int n,i,t[100000],l[100000],q[100000],a[100000][17],p,u,j,k;
int main()
{
for(F>>n>>i,i=1;i<n;F>>t[i],v[--t[i]].push_back(i),++i);
for(l[0]=u=1;p<u;++p)
for(int j:v[q[p]])
if(!l[j])
l[j]=l[q[p]]+1,q[u++]=j;
for(i=0;i<n;++i)
for(j=0;1<<j<n;a[i][j++]=-1);
for(i=0;i<n;a[i][0]=t[i],++i);
for(j=1;1<<j<n;++j)
for(i=0;i<n;++i)
if(a[i][j-1]!=-1)
a[i][j]=a[a[i][j-1]][j-1];
for(;F>>i>>j;) {
if(--i,--j,l[i]<l[j])
k=i,i=j,j=k;
for(p=1;(1<<p)<=l[i];++p);
for(k=--p;k>=0;--k)
if(l[i]-(1<<k)>=l[j])
i=a[i][k];
if(i==j)
G<<i+1<<'\n';
else {
for(k=p;k>=0;--k)
if(a[i][k]!=-1&&a[i][k]!=a[j][k])
i=a[i][k],j=a[j][k];
G<<1+t[i]<<'\n';
}
}
return 0;
}