Cod sursa(job #1840139)

Utilizator xtreme77Patrick Sava xtreme77 Data 3 ianuarie 2017 20:05:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
// Patrick Sava
// Expected : 100

#include <bits/stdc++.h>

using namespace std ;

#define FORN(a,b,c) for(int a=b;a<=c;++a)
#define FORNBACK(a,b,c) for (int a=b;a>=c;--a)
#define mp make_pair
#define pb push_back

const int MAX = 1e5 + 14 ;

vector < int > gr [ MAX ], lant [ MAX ] ;
int nrlant ;
int lantdenod[MAX] ;
int poz [MAX] ;
int sub [MAX] ;
int tata [MAX] ;
int lvl [ MAX ] ;

int readInt () {
	bool minus = false;
	int result = 0;
	char ch;
	ch = getchar();
	while (true) {
		if (ch == '-') break;
		if (ch >= '0' && ch <= '9') break;
		ch = getchar();
	}
	if (ch == '-') minus = true; else result = ch-'0';
	while (true) {
		ch = getchar();
		if (ch < '0' || ch > '9') break;
		result = result*10 + (ch - '0');
	}
	if (minus)
		return -result;
	else
		return result;
}

void dfs ( int nod )
{
    sub [nod] = 1 ;
    int where = 0 ;
    for ( auto x : gr [nod] ) {
        tata [x] = nod ;
        lvl [x] = lvl [nod] + 1 ;
        dfs (x);
        sub [nod] += sub [x] ;
        if (sub [x] > sub [where] ) {
            where = x ;
        }
    }
    if (gr[nod].size()==0){
        ++ nrlant ;
        lant [nrlant].pb(nod) ;
        poz [nod] = lant [nrlant].size() - 1;
        lantdenod [nod] = nrlant ;
    }
    else {
        lant [lantdenod[where]].pb(nod) ;
        poz [nod] = lant [lantdenod[where]].size() - 1 ;
        lantdenod [nod] = lantdenod[where] ;
    }
}

int lca ( int x , int y )
{
    lvl [0] = -1;
    while (1)
    {
        if ( lantdenod [x] == lantdenod [y] )
        {
            if ( poz [x] < poz [y] ) {
                return y ;
            }
            return x ;
        }
        int xx = lant [ lantdenod [x] ].back() ;
        int yy = lant [ lantdenod [y] ].back()  ;
        if ( lvl [tata [ xx ]] < lvl [tata [ yy ]] ) {
            swap (x,y) ;
        }
        x = tata [ lant [ lantdenod [x] ].back() ] ;
    }
}

int main ()
{
    freopen ("lca.in", "r", stdin) ;
    freopen ("lca.out" ,"w", stdout) ;
    int n, m;
    n = readInt() ;
    m = readInt() ;
    FORN ( i , 2 , n ) {
        int x ;
        x = readInt() ;
        gr [x].pb (i) ;
    }
    dfs (1) ;
    while (m--)
    {
        int x,y ;
        x = readInt() ; y = readInt() ;
        printf ("%d\n" , lca(x,y)) ;
    }
    return 0 ;
}