Cod sursa(job #1184888)

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

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

int n,m,a[100005],Euler[200005],lg,nivel[200005],rmq[200005],puteri[25];
int mat[200005][20];
vector<int>v[100005];

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 ParcurgereEuler(int x)
{
    int i,len;
    len=v[x].size();
    if (len==0) Euler[++lg]=x;
    else
    {for (i=0;i<len;i++)
        {
            Euler[++lg]=x;
            ParcurgereEuler(v[x][i]);
        }
    Euler[++lg]=x;}
}

inline void RMQ()
{
    int i,aux,put;
    mat[lg][0]=Euler[lg];
    for (i=lg-1;i>=1;i--)
        {
            mat[i][0]=min(rmq[i],rmq[i+1]);
            aux=lg-i;
            put=0;
            while (puteri[put]<aux)
                {
                    put++;
                    mat[i][put]=min(mat[i][put-1],mat[i+puteri[put-1]][put-1]);
                    if (i==lg-4)
                        fout<<puteri[put]<<" ";
                }
        }
}

int main()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=n-1;i++)
        {
            fin>>a[i];
            v[a[i]].push_back(i+1);
        }
    puteri[0]=1;
    for (i=1;i<=22;i++)
        puteri[i]=puteri[i-1]<<1;
    DFS(1,1);
    ParcurgereEuler(1);
    for (i=1;i<=lg;i++)
        rmq[i]=nivel[Euler[i]];
    RMQ();
    fout<<"\n";
    for (i=1;i<=lg;i++)
        {
            for (int j=0;j<=20;j++)
                fout<<mat[i][j]<<" ";
            fout<<"\n";
        }
    return 0;
}