Pagini recente » Cod sursa (job #1648103) | Cod sursa (job #2714030) | Cod sursa (job #1694380) | Cod sursa (job #3258174) | Cod sursa (job #2566420)
#include <bits/stdc++.h>
#define DIM 200010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,e[DIM],k,i,j,x,y,p,l[25],d[25][DIM],f[DIM],niv[DIM];
vector<int> L[DIM];
void euler(int nod,int nivel) {
e[++k]=nod, niv[k]=nivel, f[nod]=k;
for (int i=0;i<L[nod].size();i++) {
int vecin=L[nod][i];
euler(vecin,nivel+1);
e[++k]=nod, niv[k]=nivel;
}
}
int main() {
fin>>n>>m;
for (i=2;i<=n;i++) {
fin>>x;
L[x].push_back(i);
}
euler(1,1);
for (i=2;i<=k;i++)
l[i]=1+l[i/2];
for (i=1;i<=k;i++)
d[0][i]=i;
for (i=1;i<=l[k];i++) {
for (j=1;j<=k;j++) {
d[i][j]=d[i-1][j];
if (j+(1<<(i-1))<=k)
if (niv[d[i][j]]>niv[d[i-1][j+(1<<(i-1))]])
d[i][j]=d[i-1][j+(1<<(i-1))];
}
}
while (m--) {
fin>>x>>y;
x=f[x], y=f[y];
if (x>y)
swap(x,y);
p=l[y-x+1];
if (niv[d[p][x]]>niv[d[p][y-(1<<p)+1]])
fout<<e[d[p][x]]<<"\n";
else
fout<<e[d[p][y-(1<<p)+1]]<<"\n";
}
return 0;
}