Pagini recente » Cod sursa (job #2748922) | Cod sursa (job #1199313) | Cod sursa (job #2382903) | Cod sursa (job #2819154) | Cod sursa (job #759650)
Cod sursa(job #759650)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define MAX 100001
vector<int>g[MAX];
int n,h[4*MAX],c[4*MAX],l,r[4*MAX][20],pos[MAX];
void dfs(int x,int niv){
h[l]=niv; //setam nivelul nodului
c[l]=x; //setam nodul
l++;
for(int i=0;i<g[x].size();i++)
{
dfs(g[x][i],niv+1);
h[l]=niv; //setam nivelul nodului
c[l]=x; //setam nodul
l++;
}
}
void rmq(){
for(int i=0;i<l;i++)r[i][0]=i;
for(int j=1;(1<<j)<=l;j++)
for(int i=0;i+(1<<j)<=l;i++)
if(h[r[i][j-1]]<h[r[i+(1<<(j-1))][j-1]])r[i][j]=r[i][j-1]; else r[i][j]=r[i+(1<<(j-1))][j-1];
}
int main(){
int m,x,y,k;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
g[x].push_back(i);
}
dfs(1,0); // parcurgere euler
rmq();
for(int i=0;i<l;i++)
if(pos[c[i]]==0)pos[c[i]]=i;
while(m--)
{
scanf("%d %d",&x,&y);
x=pos[x]; y=pos[y]; if(x>y)swap(x,y);
k=(long double)log(y-x+1)/(long double)log(2);
if(h[r[x][k]]<h[r[y-(1<<k)+1][k]])k=r[x][k]; else k=r[y-(1<<k)+1][k];
printf("%d\n",c[k]);
}
// for(int i=0;i<l;i++){
// for(int j=0;j<=10;j++)printf("%d ",r[i][j]); printf("\n"); }
//for(int i=1;i<=l;i++)printf("%d ",c[i]); printf("\n");
//for(int i=1;i<=l;i++)printf("%d ",h[i]); printf("\n");
return 0;
}