Pagini recente » Cod sursa (job #1844946) | Cod sursa (job #2208744) | Cod sursa (job #1530746) | Cod sursa (job #1154246) | Cod sursa (job #2115964)
#include <bits/stdc++.h>
#define Nmax 100001
#define Mmax 400004
using namespace std;
int rmq[22][Mmax];
int E[Mmax], k, n;
int niv[Mmax], poz[Nmax];
int P[Mmax];
vector <int>L[Nmax];
void Euler(int nod, int nivel)
{
E[++k] = nod;
niv[k] = nivel;
poz[nod] = k;
for (auto i : L[nod])
{
Euler(i, nivel + 1);
E[++k] = nod;
niv[k] = nivel;
}
}
void RMQ()
{
int i, j, x, y;
/// P -> RMQ
P[1] = 0;
for (i = 2; i <= k; i++)
P[i] = 1 + P[i / 2];
/// RMQ FORM
for (i = 1; i <= k; i++)
rmq[0][i] = i;
int lg = P[k]; /// k -> nr de valori depuse in Euler[] (E[])
for (i = 1; i <= lg; i++)
for (j = 1; j <= k - (1 << i) + 1; j++)
{
x = niv[rmq[i - 1][j]];
y = niv[rmq[i - 1][j + (1 << (i - 1))]];
if (x < y) rmq[i][j] = rmq[i - 1][j];
else rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
}
int main()
{
/// Citire
int i, j, Q;
int x, y;
ifstream fin("lca.in");
fin >> n >> Q;
for (i = 2; i <= n; i++)
{
fin >> x;
L[x].push_back(i);
}
Euler(1, 1);
RMQ();
/// interogarile
ofstream fout("lca.out");
while (Q--)
{
fin >> x >> y;
x = poz[x];
y = poz[y];
if (x > y) swap(x, y);
int lg = P[y - x + 1];
i = rmq[lg][x];
j = rmq[lg][y - (1 << lg) + 1];
if(niv[i] < niv[j])
fout << E[i] << "\n";
else fout << E[j] << "\n";
}
fout.close();
return 0;
}