Pagini recente » Cod sursa (job #193130) | Cod sursa (job #872366) | Cod sursa (job #2088299) | Cod sursa (job #131797) | Cod sursa (job #1043297)
#include<fstream>
#include<vector>
#include<cmath>
#define N 1000100
#define logo 22
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[N],T2[N],h,n,i,lev[N],m,a,b;
void dfs(int nod,int t2,int lvl)
{
lev[nod]=lvl;
T2[nod]=t2;
if(lvl%h==0)
t2=nod;
for(int i=1;i<=n;++i)
if(T[i]==nod)
dfs(i,t2,lvl+1);
}
int lca(int x,int y)
{
while(T2[x]!=T2[y])
if(lev[x]>lev[y])
x=T2[x];
else
y=T2[y];
while(x!=y)
if(lev[x]>lev[y])
x=T[x];
else
y=T[y];
return x;
}
int main ()
{
f>>n>>m;
for(i=2;i<=n;++i)
f>>T[i];
h=(int)sqrt(n);
dfs(1,0,0);
for(i=1;i<=m;++i)
{
f>>a>>b;
g<<lca(a,b)<<"\n";
}
return 0;
}