Cod sursa(job #2863468)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 6 martie 2022 19:23:30
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <deque>
#include <algorithm>
#include <string>

#define MOD 1999999973
#define INT_MAX 1000000000

using namespace std ;

ifstream cin ("lca.in") ;
ofstream cout ("lca.out") ;

int tatal[100009], e[100009], lvl[100009], primaparitie[100009] ;

vector<int> fii[100009] ;

int peuler(int nod, int poz, int level)
{
    lvl[poz] = level ;
    e[poz ++] = nod ;

    if(fii[nod].size())
    {
        for(int f = 0 ; f < fii[nod].size() ; f ++)
            poz = peuler(fii[nod][f], poz, level + 1), e[poz] = nod, lvl[poz] = level, poz ++ ;

        return poz ;
    }
    else return poz ;
}

int main()
{
    int n, q ;

    cin >> n >> q ;

    for(int f = 2 ; f <= n ; f ++)
        cin >> tatal[f], fii[tatal[f]].push_back(f) ;
/*
    for(int f = 1 ; f <= n ; f ++)
    {
        cout << f << "     " ;

        for(int e = 0 ; e < fii[f].size() ; e ++)
            cout << fii[f][e] << " " ;

        cout << endl ;
    }
*/
    int neuler = peuler(1, 1, 0) - 1 ;

    for(int f = 1 ; f <= neuler ; f ++)
        if(!primaparitie[e[f]])primaparitie[e[f]] = f ;

    while(q --)
    {
        int st, dr, a, b, mn = INT_MAX ;

        cin >> a >> b ;

        st = primaparitie[a] ;
        dr = primaparitie[b] ;

        if(st > dr)swap(st, dr) ;

        mn = st ;

        while(st <= dr)
        {
            if(lvl[st] < lvl[mn])mn = st ;

            st ++ ;
        }
        cout << e[mn] << '\n' ;
    }

    return 0 ;
}