Pagini recente » Cod sursa (job #2451075) | Cod sursa (job #1439834) | Cod sursa (job #2438644) | Cod sursa (job #2271081) | Cod sursa (job #2973086)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct elementrmq
{
int nod;
int niv;
};
int nr, poz[100002], e[200002];
elementrmq rmq[10][200002];
int n, q, t, x, y;
vector <int> l[100002];
void dfs(int nod, int niv)
{
rmq[0][++nr]={nod, niv};
poz[nod]=nr;
for(int i=0; i<l[nod].size(); i++)
{
int fiu=l[nod][i];
dfs(fiu, niv+1);
rmq[0][++nr]={nod, niv};
}
}
void calcul_rmq()
{
for(int p=1; (1<<p)<=nr; p++)
{
for(int i=1; i<=nr; i++)
{
rmq[p][i]=rmq[p-1][i];
int j=i+ (1 << (p-1));
if(j<=nr && rmq[p-1][j].niv<rmq[p][i].niv)
{
rmq[p][i]=rmq[p-1][j];
}
}
}
e[1]=0;
for(int i=2; i<=nr; i++)
{
e[i]=e[i/2]+1;
}
}
int lca(int x, int y)
{
int p1=poz[x];
int p2=poz[y];
if(p1>p2)
swap(p1, p2);
int k=e[p2-p1+1];
int l=(1<<k);
if(rmq[k][p1].niv < rmq[k][p2-l+1].niv)
return rmq[k][p1].nod;
return rmq[k][p2-l+1].nod;
}
int main()
{
fin>>n>>q;
for(int i=2; i<=n; i++)
{
fin>>t;
l[t].push_back(i);
}
dfs(1, 0);
calcul_rmq();
for(int i=1; i<=q; i++)
{
fin>>x>>y;
fout<<lca(x, y)<<"\n";
}
return 0;
}