Pagini recente » Cod sursa (job #895760) | Cod sursa (job #2746460) | Cod sursa (job #2635263) | Cod sursa (job #1854400) | Cod sursa (job #2230641)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,j,x,r,a,b;
int ne,E[200010],P[100005],M[20][200015],k[200005],H[200005];
vector<int> adia[100005];
void peuler(int nd,int h)
{
E[++ne]=nd;
H[ne]=h;
for(auto i: adia[nd])
{
peuler(i,h+1);
E[++ne]=nd;
H[ne]=h;
}
}
int main() {
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>j;
adia[j].push_back(i);
}
peuler(1,1);
k[0]=-1;
for(i=1;i<=ne;i++)
{
if(P[E[i]]==0) P[E[i]]=i;
M[0][i]=i;
k[i]=k[i-1];
if((i&(i-1))==0) k[i]++;
}
for(j=1;j<=k[ne];j++)
for(i=1;i<=ne-(1<<j)+1;i++)
{
M[j][i]=M[j-1][i+(1<<(j-1))];
if(H[M[j-1][i]]<H[M[j][i]]) M[j][i]=M[j-1][i];
}
while(m--)
{
fin>>i>>j;
if(P[i]>P[j]) { x=i; i=j; j=x; }
x=P[j]-P[i]+1;
a=M[k[x]][P[i]];
r=M[k[x]][P[j]-(1<<k[x])+1];
if(H[a]<H[r]) r=a;
fout<<E[r]<<"\n";
}
}