Pagini recente » Cod sursa (job #3357728) | Monitorul de evaluare | Cod sursa (job #3357960) | Cod sursa (job #3357799) | Cod sursa (job #3357950)
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> v[100005];
int d[100005];
int up[100005][18];
void dfs(int nod, int p){
up[nod][0] = p;
for(int k=1; k<18; k++) up[nod][k] = up[up[nod][k-1]][k-1];
for(int i=0; i<v[nod].size(); i++){
int vec = v[nod][i];
if(vec != p){
d[vec] = d[nod] + 1;
dfs(vec, nod);
}
}
}
int main(){
FILE *fin = fopen("lca.in", "r");
FILE *fout = fopen("lca.out", "w");
int n, m;
fscanf(fin, "%d %d", &n, &m);
for(int i=2; i<=n; i++){
int x;
fscanf(fin, "%d", &x);
v[x].push_back(i);
v[i].push_back(x);
}
d[1] = 0;
dfs(1, 1);
for(int i=0; i<m; i++){
int x, y;
fscanf(fin, "%d %d", &x, &y);
if(d[x] < d[y]){
int aux = x; x = y; y = aux;
}
int dif = d[x] - d[y];
for(int k=0; k<18; k++){
if((dif>>k) & 1) x = up[x][k];
}
if(x == y){
fprintf(fout, "%d\n", x);
continue;
}
for(int k=17; k>=0; k--){
if(up[x][k] != up[y][k]){
x = up[x][k];
y = up[y][k];
}
}
fprintf(fout, "%d\n", up[x][0]);
}
fclose(fin);
fclose(fout);
return 0;
}