Pagini recente » Cod sursa (job #131875) | Cod sursa (job #2859425) | Cod sursa (job #2824438) | Cod sursa (job #41612) | Cod sursa (job #2951337)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int>v[100010];
int rmq[200010][20],i,j,n,q,a,b,first[100010],l[200010],lg,x,k;
void euler(int nod,int lev)
{
rmq[++lg][0]=nod;
l[lg]=lev;
if(first[nod]==0)
first[nod]=lg;
for(auto it:v[nod])
{
euler(it,lev+1);
rmq[++lg][0]=nod;
l[lg]=lev;
}
}
int lca(int x, int y)
{
x=first[x];
y=first[y];
if(x>y)
swap(x,y);
k=floor(log2(y-x+1));
int ans;
if(l[rmq[x][k]]<l[rmq[y-(1<<k)+1][k]])
ans=rmq[x][k];
else ans=rmq[y-(1<<k)+1][k];
return ans;
}
int main()
{
fin>>n>>q;
for(i=2;i<=n;i++)
{
fin>>x;
v[x].push_back(i);
}
euler(1,0);
for(j=1;(1<<j)<=lg;j++)
for(i=1;i+(1<<j)-1<=lg;i++)
if(l[rmq[i][j-1]]<l[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j]=rmq[i][j-1];
else
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
while(q--)
{
fin>>a>>b;
fout<<lca(a,b)<<'\n';
}
return 0;
}