Pagini recente » Cod sursa (job #2166718) | Cod sursa (job #1831585) | Cod sursa (job #1459161) | Cod sursa (job #2332438) | Cod sursa (job #2565450)
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,j,x,y,p,f[DIM],e[3*DIM],t[DIM],niv[DIM],k,l[30],d[30][DIM];
vector<int> L[DIM];
void euler(int nod,int nivel) {
e[++k]=nod, niv[k]=nivel, f[nod]=k;
for (auto vecin:L[nod]) {
if (f[vecin]==0) {
euler(vecin,nivel+1);
e[++k]=nod, niv[k]=nivel;
}
}
}
int main() {
fin>>n>>m;
for (i=2;i<=n;i++) {
fin>>t[i];
L[i].push_back(t[i]);
L[t[i]].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))];
}
}
for (i=1;i<=m;i++) {
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;
}