Pagini recente » Cod sursa (job #34330) | Cod sursa (job #2967251) | Cod sursa (job #49262) | Cod sursa (job #2378141) | Cod sursa (job #1919291)
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int H = 300;
int T2[100003],niv[100003],T[100003];
vector<int>F[100003];
void DFS(int x,int t2,int v)
{
unsigned int i;
int y;
niv[x]=v;
if(v%H==0) t2=x;
T2[x]=t2;
for(i=0;i<F[x].size();++i)
{
y = F[x][i];
DFS(y,t2,v+1);
}
}
int LCA(int x,int y)
{
while(T2[x]!=T2[y])
if(niv[x]>niv[y])
x=T2[x];
else
y=T2[y];
while(x!=y)
if(niv[x]>niv[y])
x=T[x];
else
y=T[y];
return x;
}
int main()
{
int i,x,y;
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n>>m;
for(i=2;i<=n;++i)
{
fin>>T[i];
F[T[i]].push_back(i);
}
DFS(1,1,1);
for(i=1;i<=m;++i)
{
fin>>x>>y;
fout<<LCA(x,y)<<"\n";
}
fin.close();
fout.close();
return 0;
}