Pagini recente » Cod sursa (job #2653494) | Cod sursa (job #2941820) | Cod sursa (job #2497510) | Cod sursa (job #1792588) | Cod sursa (job #3235737)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100000
int par[MAXN + 1], depth[MAXN + 1], jump[MAXN + 1], ptr;
int kthanc(int u, int k) {
while(depth[u] > k) {
if(depth[jump[u]] < k) {
u = par[u];
} else {
u = jump[u];
}
}
return u;
}
int lca(int u, int v) {
if(depth[u] < depth[v]) {
swap(u, v);
}
u = kthanc(u, depth[v]);
while(u != v) {
if(jump[u] == jump[v]) {
u = par[u];
v = par[v];
} else {
u = jump[u];
v = jump[v];
}
}
return u;
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
jump[1] = 1; // radacina
int n, m;
fin >> n >> m;
for(int i = 2; i <= n; i++) {
int p;
fin >> p;
par[i] = p;
depth[i] = depth[p] + 1;
if(depth[p] - depth[jump[p]] == depth[jump[p]] - depth[jump[jump[p]]]) {
jump[i] = jump[jump[p]];
} else {
jump[i] = p;
}
}
while(m--) {
int u, v;
fin >> u >> v;
fout << lca(u, v) << "\n";
}
return 0;
}