Pagini recente » Cod sursa (job #1724248) | Cod sursa (job #2226396) | Cod sursa (job #571772) | Cod sursa (job #218567) | Cod sursa (job #991151)
Cod sursa(job #991151)
#include<vector>
#include<stdio.h>
using namespace std;
#define N_MAX 100005
int n,m,k,euler[N_MAX<<1],level[N_MAX<<1],first[N_MAX],rmq[18][N_MAX<<1],power[N_MAX<<1];
vector <int> g[N_MAX];
void DFS(int nod,int niv)
{
vector<int> :: iterator it;
euler[++k]=nod;
level[k]=niv;
first[nod]=k;
for(it=g[nod].begin();it!=g[nod].end();it++)
{
DFS(*it,niv+1);
euler[++k]=nod;
level[k]=niv;
}
}
void RMQ()
{
int i,j,l;
power[1]=0;
for(i=2;i<=k;i++)
{power[i]=power[i>>1]+1;}
for(i=1;i<=k;i++)
{rmq[0][i]=i;}
for(i=1;(1<<i)<=k;i++)
for(j=1;j<=k-(1<<i)+1;j++)
{
l=1<<(i-1);
if(level[rmq[i-1][j]]>=level[rmq[i-1][j+l]])
rmq[i][j]=rmq[i-1][j+l];
else
rmq[i][j]=rmq[i-1][j];}
}
void LCA(int x,int y)
{
int dif,plus,sol,q;
int a=first[x], b=first[y];
if(a>b)
swap(a,b);
dif=b-a+1;
q=power[dif];
plus=dif-(1<<q);
if(level[rmq[q][a]]>level[rmq[q][a+plus]])
sol=rmq[q][a+plus];
else
sol=rmq[q][a];
printf("%d \n",euler[sol]);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;i++)
{int x;
scanf("%d ",&x);
g[x].push_back(i);}
DFS(1,0);
RMQ();
while(m--)
{int x,y;
scanf("%d %d",&x,&y);
LCA(x,y);
}
}