Pagini recente » Cod sursa (job #1172570) | Cod sursa (job #1242421) | Cod sursa (job #2766914) | Cod sursa (job #2748880) | Cod sursa (job #1309864)
#include<cstdio>
#include<vector>
#define NMAX 100002
using namespace std;
vector<int> PARENT;
vector<int> RANK;
vector<int> PARENT2;
int n, t;
int lca (int a, int b) {
if(RANK[a] > RANK[b]) return lca (b, a);
while(RANK[a] < RANK[b] / 2) {
b = PARENT2[b];
}
while(RANK[a] < RANK[b]) {
b = PARENT[b];
}
while(b != a) {
a = PARENT[a];
b = PARENT[b];
}
return a;
}
int nth_parent(int node, int n) {
while(RANK[node] > n) node = PARENT[node];
return node;
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &n, &t);
PARENT.resize(n+1, 0);
RANK.resize(n+1, 0);
PARENT2.resize(n+1, 0);
for(int i=2; i<=n; i++) {
scanf("%d", &PARENT[i]);
RANK[i] = RANK[PARENT[i]] + 1;
PARENT2[i] = nth_parent(i, RANK[i]/2);
}
int a, b;
for(int i=1; i<=t; ++i) {
scanf("%d %d", &a, &b);
printf("%d\n", lca(a, b));
}
return 0;
}