Pagini recente » Cod sursa (job #2649540) | Cod sursa (job #2372145) | Cod sursa (job #445531) | Cod sursa (job #2029896) | Cod sursa (job #2712946)
#include <bits/stdc++.h>
#define nmax 100000
using namespace std;
vector<vector<int> > tree(nmax);
int n,m;
int h[nmax],first[nmax];
int rmq[nmax<<1][(int)log2(nmax<<1)+1],k=0;
void dfs(int nod,int nivel)
{
h[nod]=nivel;
rmq[k][0]=nod;
first[nod]=k;
k++;
for(int i=0;i<tree[nod].size();i++)
{
dfs(tree[nod][i],nivel+1);
rmq[k][0]=nod;
k++;
}
}
void doRmq()
{
for(int i=1;i<=log2(k);i++)
{
for(int j=0;j<k-pow(2,i)+1;j++)
{
rmq[j][i]=h[rmq[j][i-1]]<h[rmq[j+(int)pow(2,i-1)][i-1]]?rmq[j][i-1]:rmq[j+(int)pow(2,i-1)][i-1];
}
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
cin>>n>>m;
for(int i=1;i<n;i++)
{
int a;
cin>>a;
tree[a-1].push_back(i);
}
dfs(0,0);
doRmq();
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
if(b<a){int aux=a;a=b;b=a;}
a=first[a-1],b=first[b-1];
int rsz=log2(b-a+1),res;
res=(rmq[a][rsz]>rmq[b-(int)pow(2,rsz)+1][rsz])?(rmq[a][rsz]):(rmq[b-(int)pow(2,rsz)+1][rsz]);
cout<<res+1<<'\n';
}
return 0;
}