Cod sursa(job #1414100)

Utilizator matei_cChristescu Matei matei_c Data 2 aprilie 2015 12:55:40
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<climits>
using namespace std ;

#define maxn 100005
#define H 200

int N, M ;

vector<int> graf[maxn] ;

int nivel[maxn], T[maxn], T2[maxn] ;

bool sel[maxn] ;

void dfs(int nod, int tata, int level)
{
    sel[nod] = true ;
    nivel[nod] = level ;
    T2[nod] = tata ;

    if( level % H == 0 )
        tata = nod ;

    for(size_t i = 0; i < graf[nod].size(); ++i)
    {
        int vecin = graf[nod][i] ;

        if( sel[vecin] == false )
            dfs( vecin, tata, level + 1 ) ;
    }
}

int main()
{
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);

    scanf("%d%d", &N, &M);

    for(int i = 1; i < N; ++i)
    {
        int x ;
        scanf("%d", &x);

        graf[x].push_back(i + 1) ;
        graf[i + 1].push_back(x) ;

        T[i + 1] = x ;
    }

    dfs(1, 1, 0) ;

    for(int i = 1; i <= M; ++i)
    {
        int x, y ;
        scanf("%d%d", &x, &y);

        while( T2[x] != T2[y] )
        {
            if( nivel[x] > nivel[y] )
                x = T2[x] ;
            else
                y = T2[y] ;
        }

        while( x != y )
        {
            if( nivel[x] > nivel[y] )
                x = T[x] ;
            else
                y = T[y] ;
        }

        printf("%d\n", x);
    }

	return 0 ;
}