Pagini recente » Cod sursa (job #3167374) | winners22 | Cod sursa (job #876332) | Cod sursa (job #2939732) | Cod sursa (job #2205642)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
const int NMAX = 100001;
int N, M;
int euler[2 * NMAX], K, poz[2 * NMAX], niv[NMAX];
int log[NMAX], rmq[NMAX][18];
vector<int> G[NMAX];
void DFS (int x, int lev)
{
niv[x] = lev;
euler[++K] = x;
poz[x] = K;
for (auto it : G[x])
{
DFS (it, lev + 1);
euler[++K] = x;
}
}
int RMQ ()
{
for(int i = 1; i <= K; i++)
rmq[i][0] = i;
for (int j = 1; (1 << j) <= K; j++)
for (int i = 0; i + (1 << j) - 1 <= K; i++)
if (euler[rmq[i][j - 1]] <= euler[rmq[i + (1 << (j - 1) ) ][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + (1 << (j - 1) ) ][j - 1];
}
int minim (int st, int dr)
{
int d = log[dr - st + 1];
int sol = rmq[st][d];
if (euler[sol] > euler[rmq[dr - (1 << d) + 1][d]])
sol = rmq[dr - (1 << d) + 1][d];
return euler[sol];
}
int lca (int x, int y)
{
int st = poz[x], dr = poz[y];
if (st > dr)
swap (st, dr);
return minim (st, dr);
}
int main()
{
f >> N >> M;
int x, y;
for (int i = 2; i <= N; i++)
{
f >> x;
G[x].push_back (i);
}
DFS (1, 0);
log[1] = 0;
for (int i = 2; i <= N; i++)
log[i] = log[i / 2] + 1;
RMQ();
for (int i = 1; i <= M; i++)
{
f >> x >> y;
g << lca (x, y) << '\n';
}
return 0;
}