Pagini recente » Cod sursa (job #2978158) | Cod sursa (job #1258380) | Cod sursa (job #1157941) | Cod sursa (job #2148330) | Cod sursa (job #2086649)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define pb push_back
const int Nmax = 100000 + 5;
int n, m, k, el[4 * Nmax], poz[Nmax], f[Nmax], lg[Nmax], rmq[20][4 * Nmax], g[Nmax], rmqp[20][Nmax];
vector<int>v[Nmax];
void dfs(int nod)
{
el[++k] = nod;
if(poz[nod] == 0)poz[nod] = k;
for(auto i : v[nod])
{
g[i] = g[nod] + 1;
dfs(i);
el[++k] = nod;
if(poz[nod] == 0)poz[nod] = k;
}
if(v[nod].size() == 0)el[++k] = nod;
}
int main()
{
fin >> n >> m;
for(int i = 1, a; i < n; ++i)
{
fin >> a;
f[i + 1] = a;
v[a].pb(i + 1);
}
g[1] = 1;
dfs(1);
for(int l = 2; l <= k; ++l)
lg[l] = lg[l / 2] + 1;
for(int i = 1; i <= k; ++i)
{
rmq[0][i] = g[el[i]];
rmqp[0][i] = el[i];
}
for(int l = 1; l <= lg[k]; ++l)
for(int i = 1; i + (1 << l) - 1 <= k; ++i)
{
if(rmq[l - 1][i] > rmq[l - 1][i + (1 << (l - 1))])
{
rmq[l][i] = rmq[l - 1][i + (1 << (l - 1))];
rmqp[l][i] = rmqp[l - 1][i + (1 << (l - 1))];
}
else
{
rmq[l][i] = rmq[l - 1][i];
rmqp[l][i] = rmqp[l - 1][i];
}
}
for(int i = 1, a, b, l, lung, x, y; i <= m; ++i)
{
fin >> a >> b;
x = poz[a]; y = poz[b];
if(x > y)swap(x, y);
lung = y - x + 1;
l = lg[lung];
if(rmq[l][x] < rmq[l][y - (1 << l) + 1])
fout << rmqp[l][x] << '\n';
else
fout << rmqp[l][y - (1 << l) + 1] << '\n';
}
return 0;
}