Pagini recente » Cod sursa (job #1495463) | Cod sursa (job #1280017) | Cod sursa (job #2670210) | Cod sursa (job #2679870) | Cod sursa (job #773362)
Cod sursa(job #773362)
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>
using namespace std;
#define MAXN 100005
#define MAXLOGN 20
vector<int> graph[MAXN];
int L[MAXN], T[MAXN];
int dp[MAXN][MAXLOGN];
int k, t, x, y, N, M, H;
void levels(int node, int level) {
L[node] = level;
H = max(H, level);
for(size_t i = 0; i < graph[node].size(); i++)
levels(graph[node][i], level + 1);
}
int go(int node, int p) {
int bit = 0;
while(p > 0) {
if(p & 1) node = dp[node][bit];
bit++;
p /= 2;
}
return node;
}
int lca(int x, int y) {
if(L[x] < L[y])
y = go(y, L[y] - L[x]);
else if(L[x] > L[y])
x = go(x, L[x] - L[y]);
if(x == y)
return x;
int m = 0;
while(m <= MAXLOGN) {
if(dp[x][m] == dp[y][m] && dp[x][m] != 0)
return dp[x][m];
m++;
}
return -1;
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out","w", stdout);
scanf("%d %d", &N, &M);
T[1] = 0;
for(int i = 2; i <= N; i++) {
scanf("%d", &t);
graph[t].push_back(i);
T[i] = t;
}
H = 0;
levels(1, 0);
for(int i = 1; i <= N; i++)
dp[i][0] = T[i];
for(int j = 1; (1 << j) < N; j++)
for(int i = 1; i <= N; i++)
dp[i][j] = dp[dp[i][j - 1]][j - 1];
for(int i = 0; i < M; i++) {
scanf("%d %d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}