Pagini recente » Borderou de evaluare (job #560849) | Borderou de evaluare (job #922579) | Cod sursa (job #2286952)
#include<fstream>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,x,y,t[100005],l[100005],p[100005][25];
int detl(int i){
if(l[i]!=-1)
return l[i];
return detl(t[i])+1;
}
int main(){
cin>>n>>m;
t[1]=0;
for(int i=2;i<=n;i++)
cin>>t[i];
l[1]=0;
for(int i=2;i<=n;i++)
l[i]=-1;
for(int i=1;i<=n;i++)
if(l[i]==-1) l[i]=detl(i);
for(int i=1;i<=n;i++)
for(int j=0;(1<<j)<n;j++)
p[i][j]=-1;
for(int i=1;i<=n;i++)
p[i][0]=t[i];
for(int j=1;(1<<j)<n;j++)
for(int i=1;i<=n;i++)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1];
while(m--){
cin>>x>>y;
if(l[x]<l[y]) swap(x,y);
int lg;
for(lg=1;(1<<lg)<=l[x];++lg); --lg;
for(int i=lg;i>=0;i--)
if(l[x]-(1<<i)>=l[y])
x=p[x][i];
if(x==y) {cout<<x; continue;}
for(int i=lg;i>=0;i--)
if(p[x][i]!=-1 && p[x][i]!=p[y][i]){
x=p[x][i]; y=p[y][i];
}
cout<<t[x]<<'\n';
}
}