Cod sursa(job #1184711)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 13 mai 2014 21:18:34
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

const int Nmax=100005;

int n,m,a[Nmax],x,y,nivel[Nmax],mat[Nmax][20],logaritm[Nmax];
vector<int>v[Nmax];

inline void Citire()
{
    int i,j;
    fin>>n>>m;
    for (i=2;i<=n;i++)
    {
        fin>>a[i];
        mat[i][0]=a[i];
        v[a[i]].push_back(i);
    }
    for (j=1;j<=19;j++)
        for (i=1;i<=n;i++)
            mat[i][j]=mat[mat[i][j-1]][j-1];
    logaritm[2]=1;
    for (i=3;i<=n;i++)
        logaritm[i]=logaritm[i>>1]+1;
}

inline void DFS(int x,int niv)
{
    int i,len;
    nivel[x]=niv;
    len=v[x].size();
    for (i=0;i< len;i++)
        DFS(v[x][i],niv+1);
}

inline void LCA()
{
    int i,c,d;
    while (m--)
        {
            fin>>x>>y;
            if (nivel[x]>nivel[y]) {c=x;d=y;}
            else {c=y;d=x;}
            for (i=logaritm[nivel[d]-nivel[c]];i>=0;i--)
                if (nivel[mat[c][i]]>=nivel[d])
                    c=mat[c][i];
            if (c!=d)
                {for (i=logaritm[nivel[c]];i>=0;i--)
                if (mat[c][i]!=mat[d][i])
                    {
                        c=mat[c][i];
                        d=mat[d][i];
                    }
                c=mat[c][0];}
            fout<<c<<"\n";
        }
}

int main()
{
    Citire();
    DFS(1,1);
    LCA();
    return 0;
}