Pagini recente » Cod sursa (job #1048731) | Cod sursa (job #2561528) | Cod sursa (job #245027) | Cod sursa (job #1824589) | Cod sursa (job #3211063)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
#define MAX 200
vector<int> v[100005];
int v1[100005];
int v2[100005];
int nivel[100005];
void dfs(int nod,int nod1,int niv){//printf("%d",nod);
int i;
nivel[nod]=niv;
v2[nod]=nod1;
if(niv%MAX==0) nod1=nod;
for(i=0;i<v[nod].size();i++)
dfs(v[nod][i],nod1,niv+1);
}
int main()
{
int n,q,i,a,b;
cin>>n>>q;
for(i=2;i<=n;i++){
cin>>v1[i];
v[v1[i]].push_back(i);
}
dfs(1,1,0);
while(q){
cin>>a>>b;
while(v2[a]!=v2[b]){
if(nivel[a]>nivel[b])
a=v2[a];
else
b=v2[b];
}
while(a!=b){
if(nivel[a]>nivel[b])
a=v1[a];
else
b=v1[b];
}
cout<<a<<"\n";
q--;
}
return 0;
}