Mai intai trebuie sa te autentifici.
Cod sursa(job #2713904)
Utilizator | Data | 28 februarie 2021 20:59:38 | |
---|---|---|---|
Problema | Lowest Common Ancestor | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 0.93 kb |
#include <bits/stdc++.h>
#define nlim 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> v[nlim];
int n, m, a[nlim][20], l, st[nlim], dr[nlim], k;
bool anc(int x, int y) {
return(st[x] <= st[y] && dr[x] >= dr[y]);
}
int LCA(int x, int y) {
if (anc(x, y)) return x;
if (anc(y, x)) return y;
for (int i = l; i >= 0; --i)
if (!anc(a[x][i], y)) x = a[x][i];
return a[x][0];
}
void DFS(int x, int t) {
st[x] = ++k;
a[x][0] = t;
for (int i = 1; i <= l; ++i)
a[x][i] = a[a[x][i - 1]][i - 1];
for (auto it : v[x])
DFS(it, x);
dr[x] = ++k;
}
int main()
{
f >> n >> m;
l = ceil(log2(n));
for (int i = 2; i <= n; ++i) {
int x;
f >> x;
v[x].push_back(i);
}
DFS(1, 1);
while (m--) {
int a, b;
f >> a >> b;
g << LCA(a, b) << '\n';
}
}