Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/o_alex | Monitorul de evaluare | Atasamentele paginii Profil Dietzer | Cod sursa (job #2019920)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k;
vector <int> a[100001];
int e[200001],niv[200001],ap[200001],d[20][200001],lg[200001];
void euler(int nod,int nivel)
{
int i;
k++;
e[k]=nod;
niv[k]=nivel;
ap[nod]=k;
for(i=0;i<a[nod].size();i++)
{
euler(a[nod][i],nivel+1);
k++;
e[k]=nod;
niv[k]=nivel;
}
}
int main()
{
int i,x,j,y,p,q,aux,l,sol;
f>>n>>m;
for(i=1;i<=n-1;i++)
{
f>>x;
a[x].push_back(i+1);
}
euler(1,1);
lg[1]=0;
for(i=2;i<=k;i++)
{
lg[i]=1+lg[i/2];
}
for(i=1;i<=k;i++)
{
d[0][i]=i;
}
for(i=1;i<=lg[k];i++)
{
for(j=1;j<=k-(1<<i);j++)
{
d[i][j]=d[i-1][j];
if(niv[d[i][j]]>niv[d[i-1][j+(1<<(i-1))]])
{
d[i][j]=d[i-1][j+(1<<(i-1))];
}
}
}
for(i=1;i<=m;i++)
{
f>>x>>y;
p=ap[x];
q=ap[y];
if(p>q)
{
aux=p;
p=q;
q=aux;
}
l=lg[q-p+1];
sol=d[l][p];
if(niv[sol]>niv[d[l][q-(1<<l)+1]])
{
sol=d[l][q-(1<<l)+1];
}
g<<e[sol]<<"\n";
}
return 0;
}