Cod sursa(job #2111068)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 21 ianuarie 2018 16:56:00
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in") ;
ofstream fout("lca.out") ;

vector<int> graf[100001] ;
int first[100001] ;
vector<pair<int,int> > vizit;
int n , m ;

void citire()
{
    int x;
    fin >> n >> m ;
    first[1] = -1 ;
    for ( int i = 1 ; i <= n-1 ; i++ )
    {
        first[i+1] = -1 ;
        fin >> x ;
        graf[x].push_back(i+1) ;
    }
}

void DFS(int nod,int nivel)
{
    vizit.push_back(make_pair(nod,nivel)) ;
    if ( first[nod] == -1 )
        first[nod] = vizit.size()-1 ;
    for ( int i = 0 ; i < graf[nod].size() ; i++ )
    {
        DFS(graf[nod][i],nivel+1) ;
        vizit.push_back(make_pair(nod,nivel)) ;
    }
}

int main()
{
    citire() ;
    DFS(1,0) ;
    int minim , sol , j , x , y ;
    /*for ( int i = 0 ; i < vizit.size() ; i++ )
        cout << vizit[i].first << " " << vizit[i].second << endl ;*/
    /*for ( int i = 1 ; i <= n ; i++ )
        cout << first[i] << " " ;
    cout << endl ;*/
    for ( int i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y ;
        minim = 100001;
        for ( j = first[x] ; j <= first[y] ; j++ )
        {
            if ( vizit[j].second < minim )
            {
                minim = vizit[j].second ;
                sol = vizit[j].first ;
            }
        }
        fout << sol << '\n' ;
    }
}