Cod sursa(job #1557820)

Utilizator DjokValeriu Motroi Djok Data 28 decembrie 2015 12:40:38
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int nod;
    lnod *next;
}*nod;

int i,j,n,m,LVL[100005],dpa[19][100005],lg[100005];
nod lda[100005];

void add(int x,nod &y) {
    nod p=new lnod;
    p->nod=x;
    p->next=y;
    y=p;
}

void dfs(int x,int y,int lvl) {
    LVL[x]=lvl;
    for(nod p=lda[x];p;p=p->next) dfs(p->nod,x,lvl+1);
}

int LCA(int x,int y){
    if(LVL[x]<LVL[y]) swap(x,y);

    for(int i=lg[LVL[x]];i>=0;--i)
    if(LVL[x]-(1<<i)>=LVL[y]) x=dpa[i][x];

    if(x==y) return x;

    for(int i=lg[LVL[x]];i>=0;--i)
    if(dpa[i][x] && dpa[i][x]!=dpa[i][y]) x=dpa[i][x],y=dpa[i][y];

    return dpa[0][x];
}

int main()
{
  ifstream cin("lca.in");
  ofstream cout("lca.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  for(i=2;i<=1e5;++i) lg[i]=lg[i/2]+1;

  cin>>n>>m;
  for(i=2;i<=n;++i) cin>>dpa[0][i],add(i,lda[dpa[0][i]]);

  for(i=1;i<=lg[n];++i)
   for(j=1;j<=n;++j)
   dpa[i][j]=dpa[i-1][dpa[i-1][j]];

  dfs(1,0,0);

  while(m--) cin>>i>>j,cout<<LCA(i,j)<<'\n';

 return 0;
}