Cod sursa(job #1771956)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 6 octombrie 2016 12:18:11
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> Lista[DIM];
int m[20][DIM],p2[20],Marcat[DIM],niv[DIM],p[DIM],rp[DIM];
int n,m1,s,i,j,x,d,st,dr,vst,vdr;
void dfs(int nc,int nivc){
    niv[nc]=nivc;
    s++;
    Marcat[nc]=s;
    p[s]=nivc;
    rp[s]=nc;
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i];
        if(!Marcat[nv])
            dfs(nv,nivc+1);
    }
}
int main () {
    f>>n>>m1;
    p2[0]=1;
    for(i=1;2*p2[i-1]<=n;i++)
        p2[i]=2*p2[i-1];
    d=i-1;
    for(i=1;i<n;i++){
        f>>x;
        Lista[x].push_back(i+1);
    }
    dfs(1,0);
    for(i=1;i<=n;i++){
        m[0][i]=rp[i];
        g<<m[0][i]<<" ";
    }
    g<<"\n";
    for(i=1;i<=d;i++){
        for(j=1;j<=n-p2[i]+1;j++){
            st=j;
            dr=j+p2[i-1];
            vst=m[i-1][st];
            vdr=m[i-1][dr];
            if(niv[vst]<niv[vdr])
                m[i][j]=vst;
            else
                m[i][j]=vdr;
            g<<m[i][j]<<" ";
        }
        g<<"\n";
    }
    return 0;
}