Pagini recente » Cod sursa (job #580735) | Cod sursa (job #1132359) | Rating Piros Lucian (pirosl) | Cod sursa (job #3283813) | Cod sursa (job #3286395)
#include <fstream>
#include <vector>
#define NMAX 100000
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int log = 18;
int up[NMAX + 1][log];
vector<int> g[NMAX + 1];
vector<int> viz;
int n, q;
void dfs(int nod) {
for (auto i : g[nod]) {
if (!viz[i]) {
viz[i] = viz[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);
}
}
}
int lca(int a, int b) {
if (viz[a] < viz[b]) swap(a ,b);
int k = viz[a] - viz[b];
for (int i = log - 1; i >= 0; --i)
if (k & (1 << i))
a = up[a][i];
if (a == b) return a;
for (int i = log - 1; i >= 0; --i)
if (up[a][i] != up[b][i]) {
a = up[a][i];
b = up[b][i];
}
return up[a][0];
}
int main() {
viz.resize(NMAX + 1);
cin >> n >> q;
for (int val, i = 2; i <= n; ++i) {
cin >> val;
g[val].push_back(i);
g[i].push_back(val);
}
viz[1] = 1;
dfs(1);
for (int a, b, i = 1; i <= q; ++i) {
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;;
}