Pagini recente » Cod sursa (job #860543) | Cod sursa (job #1745140) | Cod sursa (job #2594772) | Cod sursa (job #2440513) | Cod sursa (job #1919470)
#include <bits/stdc++.h>
#define H 300
using namespace std;
int n,m;
int T[100003],niv[100003],T2[100003];
vector<int>L[100003];
void DFS(int x,int t2,int v)
{
int y;
unsigned int i;
niv[x]=v;
T2[x]=t2;
if(v%H==0) t2=x;
for(i=0;i<L[x].size();++i)
{
y=L[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>>x;
T[i]=x;
L[x].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;
}