Cod sursa(job #1194909)

Utilizator nicnic28nichita trita nicnic28 Data 5 iunie 2014 11:08:00
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=1+1e5;

struct Nod{
    int t,i,o;
} noduri[N];

vector<int> g[N];
int t,n,q,a,b;

bool este(int a, int b){
    return ((a==b) || (noduri[a].i<noduri[b].i && noduri[a].o>noduri[b].o));
}
void dfs(int p){
    noduri[p].i=++t;
    for(int i=0 ; i<g[p].size() ; i++){
        dfs(g[p][i]);
    }
    noduri[p].o=++t;
}
int lca(int a, int b){
    if(este(a,b)){
        return a;
    }
    if(este(b,a)){
        return b;
    }
    return lca(noduri[a].t,noduri[b].t);
}
int main()
{
    in>>n>>q;
    for(int i=2 ; i<=n ; i++){
        in>>noduri[i].t;
        g[noduri[i].t].push_back(i);
    }
    dfs(1);
    for(int i=1 ; i<=q ; i++){
        in>>a>>b;
        out<<lca(a,b)<<'\n';
    }
    return 0;
}