Cod sursa(job #1279752)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 30 noiembrie 2014 20:56:27
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
 vector <int> v[100005];
 int n,m,dad[100005],niv[100005],dp[100005][18];

 int DFS(int nod,int lv)
 { int i;
    dp[nod][0]=dad[nod];
     for(i=1;(1<<i)<lv;i++)
    dp[nod][i]=dp[dp[nod][i-1]][i-1];

     niv[nod]=lv;
    for(i=0;i<v[nod].size();i++)
      DFS(v[nod][i],lv+1);


 }

 int LCA(int x,int y)
 { int i,scad;

    if (niv[x]<niv[y]) swap(x,y);

     scad=niv[x]-niv[y];

    for(i=18;i>=0;i--)
     if (niv[x]-(1<<i)>=niv[y])
       x=dp[x][i];

  if (x==y) return x;

    for(i=18;i>=0;i--)
     if (niv[x]-(1<<i)>=1 && dp[x][i]!=dp[y][i])
       { x=dp[x][i]; y=dp[y][i]; }

   return dad[x];
 }

int main()
{ int i,x,y;
    f>>n>>m;
    for(i=2;i<=n;i++)
    { f>>dad[i];
       v[dad[i]].push_back(i);
    }

     DFS(1,1);

    for(i=1;i<=m;i++)
    { f>>x>>y;
       cout<<LCA(x,y)<<"\n";
    }

    return 0;
}