Pagini recente » Atasamentele paginii simlotvrancea2010baraj1 | Cod sursa (job #1283820) | Cod sursa (job #1594743) | Cod sursa (job #1336676) | Cod sursa (job #2960076)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, Q, k;
int rmq[22][2000005];
int e[2000005], poz[100005], lvl[2000005], l2[2000005];
vector<int> a[100005];
void DFS(int x, int niv)
{
e[++k] = x;
poz[x] = k;
lvl[k] = niv;
for (auto w : a[x])
{
DFS(w, niv + 1);
e[++k] = x;
lvl[k] = niv;
}
}
int main()
{
int x, y, lg;
fin >> n >> Q;
for (int i = 2; i <= n; i++)
{
fin >> x;
a[x].push_back(i);
}
DFS(1, 0);
l2[1] = 0;
for (int i = 2; i <= k; i++)
l2[i] = l2[i / 2] + 1;
for (int i = 1; i <= k; i++)
rmq[0][i] = i;
for (int i = 1; i <= l2[k]; i++)
for (int j = 1; j <= k - (1 << i) + 1; j++)
{
lg = (1 << (i - 1));
rmq[i][j] = rmq[i - 1][j];
if (lvl[rmq[i - 1][j]] > lvl[rmq[i - 1][j + lg]])
rmq[i][j] = rmq[i - 1][j + lg];
}
while (Q--)
{
fin >> x >> y;
x = poz[x];
y = poz[y];
if (x > y) swap(x, y);
lg = l2[y - x + 1];
if (lvl[rmq[lg][x]] < lvl[rmq[lg][y - (1 << lg) + 1]])
fout << e[rmq[lg][x]] << "\n";
else fout << e[rmq[lg][y - (1 << lg) + 1]] << "\n";
}
}
/**
1 1 1 1 1 1 1 1 1 1 1
1 1 1 2 1 1 1 1 2 1 1 3
1 1 1 2 2 1 3 1 4 2 1 7 3
1 1 1 2 2 2 3 3 4 4 5 7 7 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 9 10 11 12 13 14
poz = 1 2 16 3 9 13 17 23 4 6 10 18 20 24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
1 2 4 9 4 10 4 2 5 11 5 2 6 2 1 3 7 12 7 13 7 3 8 14 8 3 1
0 1 2 3 2 3 2 1 2 3 2 1 2 1 0 1 2 3 2 3 2 1 2 3 2 1 0
i=0=> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
i=1=> 1 2 3 5 5 7 8 8 9 11 12 12 14 15 15 16 17 19 19 21 22 22 23 25 26 27
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣤⣤⣤⣤⣶⣦⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡿⠛⠉⠙⠛⠛⠛⠛⠻⢿⣿⣷⣤⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠋⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠈⢻⣿⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣸⣿⡏⠀⠀⠀⣠⣶⣾⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⣄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠁⠀⠀⢰⣿⣿⣯⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣷⡄⠀
⠀⠀⣀⣤⣴⣶⣶⣿⡟⠀⠀⠀⢸⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠀
⠀⢰⣿⡟⠋⠉⣹⣿⡇⠀⠀⠀⠘⣿⣿⣿⣿⣷⣦⣤⣤⣤⣶⣶⣶⣶⣿⣿⣿⠀
⠀⢸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀
⠀⣸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠉⠻⠿⣿⣿⣿⣿⡿⠿⠿⠛⢻⣿⡇⠀⠀
⠀⣿⣿⠁⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣧⠀⠀
⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀
⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀
⠀⢿⣿⡆⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇⠀⠀
⠀⠸⣿⣧⡀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠃⠀⠀
⠀⠀⠛⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⣰⣿⣿⣷⣶⣶⣶⣶⠶⠀⢠⣿⣿⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⣽⣿⡏⠁⠀⠀⢸⣿⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⢹⣿⡆⠀⠀⠀⣸⣿⠇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢿⣿⣦⣄⣀⣠⣴⣿⣿⠁⠀⠈⠻⣿⣿⣿⣿⡿⠏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠛⠻⠿⠿⠿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/