Pagini recente » Cod sursa (job #1244527) | Cod sursa (job #607731) | Cod sursa (job #1903624) | Cod sursa (job #703375) | Cod sursa (job #2775076)
#include <bits/stdc++.h>
#define NMAX 100010
#define LOG 19
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, q, poz[NMAX], depth[2 * NMAX], lg[2 * NMAX];
pair <int, int> rmq[LOG][2 * NMAX];
vector <int> edges[NMAX];
void dfs(int nod, int niv)
{
rmq[0][++m].second = nod;
rmq[0][m].first = niv;
poz[nod] = m;
for(auto child : edges[nod])
{
dfs(child, niv + 1);
rmq[0][++m].second = nod;
rmq[0][m].first = niv;
}
}
int main()
{
f >> n >> q;
for(int i = 2; i <= n; i++)
{
int x;
f >> x;
edges[x].push_back(i);
}
dfs(1, 0);
for(int i = 2; i <= m; i++)
lg[i] = lg[i / 2] + 1;
for(int i = 1; i <= lg[m]; i++)
for(int j = 1; j + (1 << i) - 1 <= m; j++)
{
rmq[i][j] = rmq[i - 1][j];
if(rmq[i][j].first > rmq[i - 1][j + (1 << (i - 1))].first)
rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
for(int i = 1; i <= q; i++)
{
int x, y;
f >> x >> y;
x = poz[x];
y = poz[y];
if(x > y)
swap(x, y);
int k = lg[y - x];
if(rmq[k][x].first > rmq[k][y - (1 << k) + 1].first)
g << rmq[k][y - (1 << k) + 1].second << "\n";
else
g << rmq[k][x].second << "\n";
}
return 0;
}