Pagini recente » Cod sursa (job #2870359) | Cod sursa (job #3248958) | Cod sursa (job #2713930) | Cod sursa (job #2752752) | Cod sursa (job #2348442)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,x,y,t[100001],d[100001],dmax,tx[100001],d2[100001];
vector <int> graf[100001];
void dfs (int nod, int t2, int inaltime)
{ int j;
tx[nod]=t2; d2[nod]=inaltime;
if(inaltime%dmax==0) t2=nod;
for( j=0;j<n;j++)
if(t[j]==nod)
dfs(j,t2,inaltime+1);
}
int LCA(int a, int b)
{ if(t[a]==t[b]) return t[a];
while(tx[a]!=tx[b])
if(d2[a]>d2[b]) a=tx[a];
else b=tx[b];
while(a!=b)
if(d2[a]>d2[b]) a=t[a];
else b=t[b];
return a;
}
int main()
{ f>>n>>m;
for(int i=2;i<=n;i++)
{ f>>t[i];
d[i]=d[t[i]]+1;
}
for(int i=2;i<=n;i++)
if(dmax<d[i]) dmax=d[i];
dmax++;
dfs(1,0,0);
for(int i=1;i<=m;i++)
{ f>>x>>y;
g<<LCA(x,y)<<'\n';
}
return 0;
}