Pagini recente » Istoria paginii utilizator/danutsebastian | Monitorul de evaluare | Cod sursa (job #1234872) | Cod sursa (job #2635159)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[100001];
int k, h[200001];
int p[200001], rmq[19][200001]; //rmq[i][j] = nodul cu nivelul minim din secventa de lungime 1<<i care porneste din j
int ap[100001];
int log2[100001];
void dfs(int r, int niv)
{
k++;
p[k] = r;
h[k] = niv;
ap[r] = k;
for (int i = 0; i<v[r].size(); i++)
{
dfs(v[r][i], niv+1);
k++;
p[k] = r;
h[k] = niv;
}
}
int main()
{
int n, i, m, x, j, d, rasp;
fin >> n >> m;
for (i = 2; i<=n; i++)
{
fin >> x;
v[x].push_back(i);
log2[i] = 1 + log2[i>>1];
}
dfs(1, 0);
for (i = 1; i<=k; i++)
rmq[0][i] = i;
for (i = 1; (1<<i) <= k; i++)
for (j = 1; j<=k-(1<<i)+1; j++)
{
rmq[i][j] = rmq[i-1][j];
if (h[rmq[i-1][j+(1<<(i-1))]] < h[rmq[i][j]])
rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
}
for (i = 1; i<=m; i++)
{
fin >> x >> j;
x = ap[x];
j = ap[j];
if (x > j)
swap(x, j);
d = log2[j-x+1];
rasp = rmq[d][x];
if (h[rmq[d][j-(1<<d)+1]] < h[rasp])
rasp = rmq[d][j-(1<<d)+1];
fout << p[rasp] << '\n';
}
return 0;
}