Pagini recente » Cod sursa (job #2321966) | Cod sursa (job #3281322) | Cod sursa (job #859594) | Cod sursa (job #2170634) | Cod sursa (job #2218282)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
const int MAXLOG = 19;
vector < int > g[MAXN + 1];
int lev[MAXN + 1] = {0, 1}, rmq[MAXLOG + 1][2 * MAXN + 2], frst[MAXN + 1], lg[2 * MAXN + 2], aux;
void euler_trav(int node) {
frst[node] = ++aux;
rmq[0][aux] = node;
for (auto it : g[node]) {
lev[it] = lev[node] + 1;
euler_trav(it);
rmq[0][++aux] = node;
}
}
int main()
{
int n, m;
ifstream fin("lca.in");
fin >> n >> m;
for (int i = 2; i <= n; ++i) {
int x;
fin >> x;
g[x].push_back(i);
}
euler_trav(1);
for (int i = 1; (1 << i) <= aux; ++i) {
int p2 = (1 << i);
for (int j = 1; j <= aux - p2 + 1; ++j)
if (lev[rmq[i - 1][j]] < lev[rmq[i - 1][j + p2 / 2]])
rmq[i][j] = rmq[i - 1][j];
else
rmq[i][j] = rmq[i - 1][j + p2 / 2];
}
for (int i = 2; i <= aux; ++i)
lg[i] = lg[i / 2] + 1;
ofstream fout("lca.out");
for (int i = 0; i < m; ++i) {
int x, y;
fin >> x >> y;
x = frst[x];
y = frst[y];
if (x > y)
swap(x, y);
int diff = lg[y - x + 1];
if (lev[rmq[diff][x]] < lev[rmq[diff][y - (1 << diff) + 1]])
fout << rmq[diff][x] << '\n';
else
fout << rmq[diff][y - (1 << diff) + 1] << '\n';
}
fin.close();
fout.close();
return 0;
}