Pagini recente » Cod sursa (job #472915) | Cod sursa (job #900474) | Cod sursa (job #472133) | Cod sursa (job #290291) | Cod sursa (job #3197256)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout("lca.out");
int n,m,i,k,x,y,j,l,t,st[100001],dr[100001],P[100001],D[20][100001];
vector <int> V[100001];
void dfs(int nod)
{
st[nod]=++k;
for(int j=0;j<V[nod].size();j++)
dfs(V[nod][j]);
dr[nod]=++k;
}
void stramosi()
{
for(int i=1;i<=n;i++)
D[0][i]=P[i];
for(int i=1;i<=19;i++)
for(int j=1;j<=n;j++)
D[i][j]=D[i-1][D[i-1][j]];
}
bool parent(int x,int y){return st[x]<=st[y]&&dr[y]<=dr[x];}
int lca(int x,int y)
{
if(parent(x,y))
return x;
if(parent(x,y))
return y;
for(int i=19;i>=0;i--)
{
int nod=D[i][x];
if(nod!=0&&!parent(nod,y))
x=nod;
}
return D[0][x];
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>P[i];
V[P[i]].push_back(i);
}
dfs(1);
stramosi();
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<"\n";
}
return 0;
}