Pagini recente » Cod sursa (job #1647787) | Cod sursa (job #2725013) | Cod sursa (job #1809230) | Cod sursa (job #696371) | Cod sursa (job #3152701)
#include <fstream>
#include <vector>
#define int long long
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int nMax = 1e5 + 1;
const int logN = 20;
vector<int>G[nMax];
int up[nMax][logN];
int timer;
int in[nMax], out[nMax];
void dfs(int u = 1, int par = 1) {
in[u] = ++timer;
up[u][0] = par;
for (int i = 1; i < logN; ++i) {
up[u][i] = up[up[u][i - 1]][i - 1];
}
for (auto i : G[u]) {
if (i != par)
dfs(i, u);
}
out[u] = ++timer;
}
bool ancestor(int u, int v) {
return in[u] <= in[v] && out[u] >= out[v];
}
int lca(int u, int v) {
if (ancestor(u, v))
return u;
if (ancestor(v, u))
return v;
for (int i = logN - 1; i >= 0; --i) {
if (!ancestor(up[u][i], v))
u = up[u][i];
}
return up[u][0];
}
int32_t main() {
int n, q;
f >> n >> q;
for (int i = 2; i <= n; ++i) {
int x;
f >> x;
G[x].push_back(i);
G[i].push_back(x);
}
dfs();
while (q--) {
int a, b;
f >> a >> b;
g << lca(a, b) << '\n';
}
return 0;
}