Pagini recente » Cod sursa (job #2942751) | Cod sursa (job #1800937) | Cod sursa (job #3257428) | Cod sursa (job #2154222) | Cod sursa (job #1814469)
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
#define NMAX 100100
vector<int> G[NMAX];
int euler_tour[3*NMAX], elen=1, occur[NMAX];
void dfs(int u){
if(!occur[u])
occur[u]=elen;
euler_tour[elen++]=u;
int v;
for(int i=0; i<G[u].size(); i++){
v=G[u][i];
dfs(v);
euler_tour[elen++]=u;
}
}
int din[3*NMAX][100];
int main(){
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int n, q, t, i, j, r1, r2, k, aux;
scanf("%d%d", &n, &q);
for(i=2; i<=n; i++){
scanf("%d", &t);
G[t].push_back(i);
}
dfs(1);
elen--;
/* for(i=1; i<=elen; i++)
printf("%d ", euler_tour[i]);
printf("\n");*/
for(i=1; i<=elen; i++){
din[i][0]=i;
}
for(j=1; (1 << j) <=elen; j++){
for(i=1; i + (1 << j) <= elen; i++){
if(euler_tour[din[i][j - 1]] < euler_tour[din[i + (1 << (j - 1))][j - 1]])
din[i][j] = din[i][j - 1];
else
din[i][j] = din[i + (1 << (j - 1))][j-1];
}
}
/*for(i=1; i <= elen; i++){
for(j=0; i + (1 << j) <= elen; j++)
printf("%d", euler_tour[din[i][j]]);
printf("\n");
}*/
for(i = 1; i <= q; i++){
scanf("%d%d", &r1, &r2);
r1=occur[r1];
r2=occur[r2];
if(r2<r1){
aux=r1;
r1=r2;
r2=aux;
}
k = log2(r2 - r1 + 1.0);
printf("%d\n", min(euler_tour[din[r1][k]], euler_tour[din[r2 - (1<<k) +1][k]]));
}
return 0;
}