Pagini recente » Cod sursa (job #767894) | Cod sursa (job #557480) | Cod sursa (job #1947211) | Cod sursa (job #3223934) | Cod sursa (job #2702672)
#include <bits/stdc++.h>
#define NMAX 200000
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, k, q;
int RMQ[20][NMAX];
int logs[NMAX + 1];
int nivel[NMAX + 1];
int Euler[NMAX + 1];
int pozE[NMAX / 2 + 1];
vector<int> g[NMAX / 2 + 1];
void DFS(int nod, int niv)
{
Euler[++k] = nod;
nivel[k] = niv;
pozE[nod] = k;
for (int i : g[nod])
{
DFS(i, niv + 1);
Euler[++k] = nod;
nivel[k] = niv;
}
}
void ComputeRMQ()
{
int val;
for (int i = 1; i <= k; i++)
RMQ[0][i] = i;
for (int i = 1; (1 << i) <= n; i++)
for (int j = 1; j - (1 << i) + 1 <= k; j++)
{
val = (1 << (i - 1));
RMQ[i][j] = RMQ[i - 1][j];
if (nivel[RMQ[i - 1][j]] > nivel[RMQ[i - 1][j + val]])
RMQ[i][j] = RMQ[i - 1][j + val];
}
}
int main()
{
int ans;
int x, y, logac;
fin >> n >> q;
for (int i = 2; i <= n; i++)
{
fin >> x;
g[x].push_back(i);
}
DFS(1, 0);
for (int i = 2; i <= k; i++)
logs[i] = logs[i / 2] + 1;
ComputeRMQ();
for (int i = 1; i <= q; i++)
{
fin >> x >> y;
x = pozE[x];
y = pozE[y];
if (x > y)swap(x, y);
logac = logs[y - x + 1];
ans = RMQ[logac][x];
if (nivel[ans] > nivel[RMQ[logac][y - (1 << logac) + 1]])
ans = RMQ[logac][y - (1 << logac) + 1];
fout << Euler[ans] << "\n";
}
fin.close();
fout.close();
return 0;
}