Pagini recente » Cod sursa (job #2837487) | Cod sursa (job #1981775) | Cod sursa (job #1136421) | Cod sursa (job #2087076) | Cod sursa (job #2186342)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
int n,m,adancime[100005],first[100005],rmq[50][300005];
bool viz[100005];
vector <int> G[100005];
vector <int> eulerList;
void parcurgereEuler(int nod)
{
viz[nod]=1;
eulerList.push_back(nod);
for(auto fiu:G[nod])
{
if(!viz[fiu])
{
parcurgereEuler(fiu);
eulerList.push_back(nod);
}
}
}
void buildrmq()
{
for(int i=1; i<=eulerList.size(); i++)
rmq[0][i]=eulerList[i-1];
for(int i=1; i<=log2(eulerList.size()); i++)
for(int j=1; j+(1<<(i-1))<=eulerList.size(); j++)
{
if(adancime[rmq[i-1][j]]<=adancime[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
int tata;
for(int i=2; i<=n; i++)
{
scanf("%d",&tata);
G[tata].push_back(i);
adancime[i]=1+adancime[tata];
}
parcurgereEuler(1);
buildrmq();
for(int i=0; i<eulerList.size(); i++)
if(!first[eulerList[i]])
first[eulerList[i]]=i+1;
int st,dr;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&st,&dr);
st=first[st];
dr=first[dr];
if(st>dr)
swap(st,dr);
int rasp,lint=log2(dr-st+1);
if(adancime[rmq[lint][st]]<adancime[rmq[lint][dr-(1<<lint)+1]])
rasp=rmq[lint][st];
else
rasp=rmq[lint][dr-(1<<lint)+1];
printf("%d\n",rasp);
}
return 0;
}