Pagini recente » Cod sursa (job #2729720) | Cod sursa (job #2722378) | Cod sursa (job #514043) | Cod sursa (job #2944332) | Cod sursa (job #2348605)
#include <bits/stdc++.h>
#define MAXN 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,t[MAXN],lvl[MAXN],m,x,y,h,p[MAXN],a,b;
void dfs(int nod)
{ if(lvl[nod]<h)
p[nod]=1;
if(lvl[nod]%h==0)
p[nod]=t[nod];
else
p[nod]=p[t[nod]];
for(int k=2;k<=n;k++)
if(t[k]==nod)
dfs(k);
}
int LCA(int x, int y)
{ while(p[x]!=p[y])
if(lvl[x]>lvl[y])
x=p[x];
else
y=p[y];
while(x!=y)
if(lvl[x]>lvl[y])
x=t[x];
else
y=t[y];
return x;
}
int main()
{ f>>n>>m;
for(int i=2;i<=n;i++)
{ f>>t[i];
lvl[i]=lvl[t[i]]+1;
}
for(int i=1;i<=n;i++)
if(h<t[i]) h=t[i];
h=sqrt(h);
dfs(1);
for(int i=1;i<=m;i++)
{ f>>a>>b;
g<<LCA(a,b)<<'\n';
}
return 0;
}