Pagini recente » Cod sursa (job #215815) | Cod sursa (job #1263186) | Cod sursa (job #2271917) | Cod sursa (job #2852098) | Cod sursa (job #2973100)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int euler[200005] , niv[200005] , n , m , i , k , last[200005] , rmq[200005][19] , x , y , aux , vecin;
vector <int>v[200005];
int querry (int a , int b)
{
int k = 0;
while ( (1 << k) <= (b - a + 1))
k++;
k--;
if (niv[rmq[a][k]] < niv[rmq[b - (1 << k) + 1][k]])
return rmq[a][k];
else
return rmq[b - (1 << k) + 1][k];
}
void dfs (int nod , int poz)
{
euler[++k] = nod;
niv[nod] = poz;
last[nod] = k;
for (auto vecin : v[nod])
{
dfs (vecin , poz + 1);
euler[++k] = nod;
last[nod] = k;
}
}
int main()
{
f >> n >> m;
for (int i = 2 ; i <= n ; i++)
{
f >> x;
v[x].push_back (i);
}
dfs (1 , 0);
for (int i = 1 ; i <= k ; i++)
rmq[i][0] = euler[i];
aux = k;
for (int k = 1 ; (1 << k) <= aux ; k++)
{
for (int i = 1 ; i + (1 << k) - 1 <= aux ; i++)
if (niv[rmq[i][k - 1]] < niv[rmq[i + (1 <<(k - 1))][k - 1]])
rmq[i][k] = rmq[i][k - 1];
else
rmq[i][k] = rmq[i + (1 <<(k - 1))][k - 1];
}
for (int i = 1 ; i <= m ; i++)
{
f >> x >> y;
if (last[x] < last[y])
g << querry (last[x] , last[y]) << '\n';
else
g << querry (last[y] , last[x]) << '\n';
}
return 0;
}