Cod sursa(job #689225)

Utilizator informatician28Andrei Dinu informatician28 Data 24 februarie 2012 11:07:02
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream> 
#include<vector> 
#include<algorithm>
#define DIM 100001
#define pb push_back
#define INF 0x3f3f3f3f
using namespace std; 

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

vector< int > G[DIM];
int Tata[DIM], N, contor, Euler[DIM *2], Lev[DIM*2], First[DIM], minim, pos, M;
bool viz[DIM];

void DFs(int node, int level)
{
    viz[node] = 1;
    Lev[++contor] = level;
    Euler[contor] = node;
    First[node] = contor;
    for(vector< int > ::iterator it = G[node].begin(); it != G[node].end(); ++it)
        if( !viz[*it] )
        {
            DFs(*it, level+1);
            
        Euler[++contor] = node; 
        Lev[contor] = level;
        }
}
void lca(int x, int y)
{
    int st = First[x]; 
    int dr = First[y]; 
    
    if( st > dr )
        swap(st, dr);
    for(int i = st; i <= dr; i++)
        if( Lev[i] < minim )
            {
                minim = Lev[i];
                pos = i;
        }
}
int main()
{
    int i, x, y;
    
    in >> N >> M;
    for(i = 2; i <= N; i++)
    {
        in >> Tata[i]; 
        G[Tata[i]].pb(i);
    }
    
    DFs(1, 0);
    for(i = 1; i <= M; i++)
    {
        in >> x >> y;
        minim = INF;
        lca(x,y);
        out << Euler[pos] << '\n';
    }
}