Pagini recente » Cod sursa (job #1454825) | Borderou de evaluare (job #2959021) | Cod sursa (job #1573883) | Cod sursa (job #2360748) | Cod sursa (job #3355067)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, q;
const int nmax = 200005;
vector <int> l[100005];
struct numar
{
int nod,niv;
} rmq[19][nmax];
int e[nmax], p_curent, p_start[nmax];
void dfs(int nod, int niv)
{
rmq[0][++p_curent] = {nod, niv};
p_start[nod] = p_curent;
for(int i = 0; i < l[nod].size(); i++)
{
int vecin = l[nod][i];
dfs(vecin, niv+1);
rmq[0][++p_curent] = {nod,niv};
}
}
int lca(int x, int y)
{
int pos_x = p_start[x];
int pos_y = p_start[y];
if(pos_x > pos_y)
swap(pos_x, pos_y);
int p = e[pos_y - pos_x + 1];
numar st = rmq[p][pos_x];
numar dr = rmq[p][pos_y - (1 << p) + 1];
if(st.niv < dr.niv)
return st.nod;
else
return dr.nod;
}
int main()
{
f >> n >> q;
for(int i = 2; i <= n; i++)
{
int x;
f >> x;
l[x].push_back(i);
}
p_curent = 0;
dfs(1, 1);
e[1] = 0;
for(int i = 2; i <= p_curent; i++)
e[i] = e[i / 2] + 1;
for(int p = 1; (1 << p) <= p_curent; p++)
for(int i = 1; i <= p_curent; i++)
{
numar st = rmq[p-1][i];
if(i + (1 << (p - 1)) <= p_curent)
{
numar dr = rmq[p-1][i + (1 << (p - 1))];
if(st.niv < dr.niv)
rmq[p][i] = st;
else
rmq[p][i] = dr;
}
else
rmq[p][i] = st;
}
while(q--)
{
int x, y;
f >> x >> y;
g << lca(x, y)<< "\n";
}
return 0;
}