Pagini recente » Cod sursa (job #2802720) | Cod sursa (job #2909992) | Cod sursa (job #2328739) | Cod sursa (job #2689633) | Cod sursa (job #2572976)
#include <bits/stdc++.h>
#define NM 100005
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, t[NM], niv[NM];//nivel, nod
int ap[NM];//prima ap
vector<pair<int,int>> v[int(log2(4*NM))+2];
vector<int> g[NM];
bitset<NM> viz;
void euler(int nod)
{
viz[nod] = 1;
v[0].push_back({niv[nod], nod});
ap[nod] = v[0].size()-1;
for(auto it:g[nod])
if(!viz[it])
{
niv[it] = niv[nod] + 1;
euler(it);
v[0].push_back({niv[nod], nod});
}
}
void build_rmq()
{
int N = v[0].size();
for(int i=1; (1<<i)<=N; i++)
{
v[i].push_back({0, 0});
for(int j=1; j<=N-(1<<i)+1; j++)
{
if(v[i-1][j].first < v[i-1][j+(1<<(i-1))].first)
v[i].push_back(v[i-1][j]);
else v[i].push_back(v[i-1][j+(1<<(i-1))]);
}
}
}
int query(int x, int y)
{
x = ap[x], y = ap[y];
if(x > y)
swap(x, y);
int p = log2(y-x+1);
if(v[p][x].first < v[p][y-(1<<p)+1].first)
return v[p][x].second;
else return v[p][y-(1<<p)+1].second;
}
void read();
int main()
{
read();
niv[1] = 1;
v[0].push_back({0, 0});
euler(1);
build_rmq();
while(m--)
{
int x, y;
fin >> x >> y;
fout << query(x, y) << '\n';
}
return 0;
}
void read()
{
fin >> n >> m;
for(int i=2; i<=n; i++)
{
fin >> t[i];
//g[i].push_back(t[i]);
g[t[i]].push_back(i);
}
}