Pagini recente » Cod sursa (job #2602407) | Cod sursa (job #2944238) | Cod sursa (job #2217432) | Cod sursa (job #1740159) | Cod sursa (job #3218261)
#include <bits/stdc++.h>
using namespace std;
const int LOG = 20;
const int MAX = 100000;
int N, M, x;
bool v[MAX + 3];
int level[MAX + 3];
int up[MAX + 3][LOG + 3];
int w1, w2;
int Q;
void dfs(int nod, vector<int>G[]) {
v[nod] = true;
for(auto i : G[nod]) {
if(!v[i]) {
level[i] = level[nod] + 1;
up[i][0] = nod;
for(int j = 1; j <= LOG; j++) {
up[i][j] = up[up[i][j - 1]][j - 1];
}
dfs(i, G);
}
}
}
void test_case() {
vector<int>G[MAX + 3];
memset(level, 0, sizeof(level));
memset(v, 0, sizeof(v));
cin >> N;
cin >> Q;
for(int i = 2; i <= N; i++) {
cin >> x;
G[x].push_back(i);
G[i].push_back(x);
}
dfs(1, G);
// for(int i = 1; i <= N; i++) {
// for(int j = 0; j <= LOG; j++) {
// cout << up[i][j] << ' ';
// }
// cout << '\n';
// }
for(int i = 1; i <= Q; i++) {
cin >> w1 >> w2;
if(level[w2] > level[w1]) swap(w1, w2);
int k = level[w1] - level[w2];
for(int j = 0; j <= LOG; j++) {
if(k & (1 << j)) {
w1 = up[w1][j];
}
}
if(w1 == w2) {
cout << w1 << '\n';
continue;
}
for(int j = LOG - 1; j >= 0; j--) {
if(up[w1][j] != up[w2][j]) {
w1 = up[w1][j];
w2 = up[w2][j];
}
}
//cout << w1 << ' ' << w2 << '\n';
cout << up[w1][0] << '\n';
}
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int T = 1;
//cin >> T;
while(T--) {
test_case();
}
}