Pagini recente » Cod sursa (job #2541682) | Cod sursa (job #2282262) | Cod sursa (job #2897896) | Cod sursa (job #3153266) | Cod sursa (job #3214348)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int e[400005], expo[400005], niv[400005], p[400005], n, m, len;
int rmq[20][400001];
vector <int> g[100005];
void DFS(int k, int level)
{
e[++len] = k;
niv[len] = level;
p[k] = len;
for (int i : g[k])
{
DFS(i, level + 1);
e[++len] = k;
niv[len] = level;
}
}
int main()
{
int i, j, exp, L, x;
fin >> n >> m;
for (i = 2; i <= n; i++)
{
fin >> x;
g[x].push_back(i);
}
DFS(1, 0);
for (i = 2; i <= len; i++)
expo[i] = 1 + expo[i / 2];
for (i = 1; i <= len; i++)
rmq[0][i] = i;
for (i = 1; i <= expo[len]; i++)
{
L = (1 << i);
for (j = 1; j <= len - L + 1; j++)
if (niv[rmq[i - 1][j]] < niv[rmq[i - 1][j + L / 2]])
rmq[i][j] = rmq[i - 1][j];
else
rmq[i][j] = rmq[i - 1][j + L / 2];
}
while (m--)
{
fin >> i >> j;
i = p[i];
j = p[j];
if (i > j)
swap(i, j);
exp = expo[j - i + 1];
L = (1 << exp);
if (niv[rmq[exp][i]] < niv[rmq[exp][j - L + 1]])
fout << e[rmq[exp][i]] << "\n";
else
fout << e[rmq[exp][j - L + 1]] << "\n";
}
return 0;
}