Pagini recente » Cod sursa (job #803380) | Cod sursa (job #40526) | Cod sursa (job #748527) | Cod sursa (job #1202600) | Cod sursa (job #1111348)
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 100005
using namespace std;
vector <int> v[nmax];
int euler[2*nmax+5],ep;
int lev[2*nmax+5];
int pos[nmax];
int index[20][2*nmax+5];
int n,m;
void dfs(int n,int k) {
euler[++ep] = n;
lev[ep] = k;
pos[n] = ep;
while (!v[n].empty()) {
dfs(v[n].back(),k+1);
v[n].pop_back();
euler[++ep] = n;
lev[ep] = k;
}
}
int log(int a) {
int x=0;
while ((1<<x) <= a) x++;
return x-1;
}
int main() {
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<n;i++) {
int t;
scanf("%d",&t);
v[t].push_back(i+1);
}
for (int i=1;i<=2*n+1;i++) index[0][i] = i;
dfs(1,1);
for (int i=1;i<=19;i++) {
for (int j=1;j<=2*n-1-(1<<i)+1;j++) {
index[i][j] = (lev[index[i-1][j]]<lev[index[i-1][j+(1<<(i-1))]])?(index[i-1][j]):(index[i-1][j+(1<<(i-1))]);
}
}
for (int i=1;i<=m;i++) {
int a,b;
scanf("%d %d",&a,&b);
a = pos[a],b = pos[b];
if (a > b) swap(a,b);
int k = log(b-a+1);
int r = (lev[index[k][a]] < lev[index[k][b-(1<<k)+1]])?(euler[index[k][a]]):(euler[index[k][b-(1<<k)+1]]);
printf("%d\n",r);
}
return 0;
}