Pagini recente » Cod sursa (job #1498962) | Cod sursa (job #2185435) | Cod sursa (job #2874301) | Cod sursa (job #887804) | Cod sursa (job #3003715)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> a[100005];
int rmq[21][2000005], lg[2000005];
int n, m, e[2000005], poz[100005], niv[2000005], k;
void DFS(int x, int nivel)
{
e[++k] = x;
niv[k] = nivel;
poz[x] = k;
for(auto w : a[x])
{
DFS(w, nivel + 1);
e[++k] = x;
niv[k] = nivel;
}
}
int main()
{
int i, j, x, y, exp;
in >> n >> m;
for(i = 2; i <= n; i++)
{
in >> x;
a[x].push_back(i);
}
DFS(1, 1);
for(i = 1; i <= k; i++)
rmq[0][i] = i;
lg[1] = 0;
for(i = 2; i <= k; i++)
lg[i] = lg[i/2] + 1;
for(i = 1; i <= lg[k]; i++)
for(j = 1; j <= k - (1 << i) + 1; j++)
{
rmq[i][j] = rmq[i - 1][j];
if(niv[rmq[i - 1][j]] > niv[rmq[i - 1][j + (1 << (i - 1))]])
rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
while(m--)
{
in >> x >> y;
x = poz[x];
y = poz[y];
if(x > y) swap(x, y);
exp = lg[y - x + 1];
if(niv[rmq[exp][x]] > niv[rmq[exp][y - (1 << exp) + 1]])
out << e[rmq[exp][y - (1 << exp) + 1]] << "\n";
else out << e[rmq[exp][x]] << "\n";
}
return 0;
}