Pagini recente » Cod sursa (job #1185728) | Cod sursa (job #3247111) | Cod sursa (job #2594480) | Cod sursa (job #1375101) | Cod sursa (job #1133351)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define nmax 100009
using namespace std;
int aparitie[nmax],dad[nmax];
struct nod
{
int val;
int nivel;
};
struct vecini
{
vector<int> v;
};
vecini g[nmax];
vector <nod> euler;
int d[nmax][40];
void DFS(int n,int k)
{
int i;
nod aux;
aux.nivel=k;
aux.val=n;
euler.push_back(aux);
if(aparitie[n]==0)
{
aparitie[n]=euler.size()-1;
}
for(i=0;i<g[n].v.size();++i)
{
DFS(g[n].v[i],k+1);
nod aux;
aux.nivel=k;
aux.val=n;
euler.push_back(aux);
}
}
int main()
{
int i,n,m,x,j,y,k;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=2;i<=n;i++)
{
scanf("%d",&x);
g[x].v.push_back(i);
}
nod start;
start.val=0;
start.nivel=0;
euler.push_back(start);
aparitie[1]=1;
DFS(1,0);
int lung=euler.size()-1;
for(i=1;i<=lung;i++)
d[i][0]=i;
for(j=1;(1<<j)<=lung;j++)
for(i=1;i+(1<<j)-1<=lung;i++)
if(euler[d[i][j-1]].nivel>euler[d[i+(1<<(j-1))][j-1]].nivel)
d[i][j]=d[i+(1<<(j-1))][j-1];
else
d[i][j]=d[i][j-1];
//d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=aparitie[x];y=aparitie[y];
k=log2(abs(y-x+1));
if(euler[d[x][k]].nivel<euler[d[y-(1<<k)+1][k]].nivel)
printf("%d\n",euler[d[x][k]].val);
else
printf("%d\n",euler[d[y-(1<<k)+1][k]].val);
}
return 0;
}