Cod sursa(job #933153)

Utilizator PatrikStepan Patrik Patrik Data 29 martie 2013 17:30:50
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define MAX 100001
    #define pb push_back
    int N ,M , T[MAX]  , Lev[MAX] , up[MAX];
    vector<int>G[MAX] ;

    void DF(int nod,int lev,int niv)
    {
        Lev[nod] = lev;
        up[nod] = niv;
        if(niv%200==0)niv = nod;
        for(int j = 0 ; j < (int)G[nod].size() ; ++j )
            DF(G[nod][j],lev+1,niv);
    }

    int main()
    {
        int x , y;
        freopen("lca.in" , "r" , stdin );
        freopen("lca.out" , "w" , stdout );
        scanf("%d%d" , &N , &M );
        for(int i = 2 ; i <= N ; ++i )
            {scanf("%d" , &T[i]);
            G[T[i]].pb(i);}
        DF(1,0,0);
        for(int i = 1 ; i <= M ; ++i )
        {
            scanf("%d%d" , &x , &y );
            while(x != y)
                if(Lev[x] > Lev[y])
                    x = T[x];
                else
                    y = T[y];
            printf("%d\n" , x);
        }
        return 0;
    }