Pagini recente » Cod sursa (job #2146099) | Cod sursa (job #2544233) | Cod sursa (job #2111290) | Cod sursa (job #915871) | Cod sursa (job #2940780)
#include <bits/stdc++.h>
using namespace std;
const unsigned seed = chrono :: system_clock :: now().time_since_epoch().count();
mt19937 rng(seed);
using ll = long long;
const int N = 1e5 + 5, S = 330;
int tin[N], tout[N], timer, euler[2 * N][18], d[N], r[2 * N];
int upd_queue[S + 5];
vector <int> g[N];
void dfs(int u, int p = 0) {
d[u] = d[p] + 1;
tin[u] = ++timer;
r[timer] = u;
euler[timer][0] = tin[u];
for(int v : g[u]) if(v != p)
dfs(v, u);
tout[u] = ++timer;
euler[timer][0] = tin[p];
}
int lg2[2 * N];
void precalc_lca(int n) {
for(int i = 2; i <= 2 * n; i++)
lg2[i] = lg2[i >> 1] + 1;
for(int l = 1; l <= 17; l++)
for(int i = 1; i <= 2 * n; i++)
euler[i][l] = min(euler[i][l - 1], euler[i + (1 << l - 1)][l - 1]);
}
int lca(int u, int v) {
if(tin[u] <= tin[v] && tout[v] <= tout[u]) return u;
if(tin[v] <= tin[u] && tout[u] <= tout[v]) return v;
if(tin[u] > tin[v]) swap(u, v);
u = tout[u]; v = tin[v];
int l = lg2[v - u + 1];
int tinlca = min(euler[u][l], euler[v - (1 << l) + 1][l]);
return r[tinlca];
}
int main()
{
const string fname = "lca";
ifstream cin(fname + ".in");
ofstream cout(fname + ".out");
// ios_base :: sync_with_stdio(false); cin.tie(0);
int n, m;
cin >> n >> m;
// for(int i = 1, u, v; i < n; i++)
// cin >> u >> v,
// g[u].push_back(v),
// g[v].push_back(u);
for(int u = 2, v; u <= n; u++)
cin >> v,
g[u].push_back(v),
g[v].push_back(u);
dfs(1);
precalc_lca(n);
for(int i = 1, u, v; i <= m; i++)
cin >> u >> v,
cout << lca(u, v) << "\n";
return 0;
}