Cod sursa(job #1729975)

Utilizator xSliveSergiu xSlive Data 15 iulie 2016 23:14:57
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#define NMAX 100010
using namespace std;
vector<int> v[NMAX];
int tati[NMAX];
vector<int> euler,level;
int primaAparitie[NMAX];
void constr(int nod,int nivel,int &indice){
    euler.push_back(nod);
    level.push_back(nivel);
    if(primaAparitie[nod]==0)
        primaAparitie[nod]=indice;
    indice++;
    for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++){
        constr(*it,nivel+1,indice);
        euler.push_back(nod);
        level.push_back(nivel);
        indice++;
    }
}

int main()
{
    ifstream f("lca.in");
    ofstream g("lca.out");
    int n,m,ii,is;
    int a;
    int lev,ancestor;
    f >> n >> m;
    int indice=0;
    for(int i=0;i<n-1;i++){
        f >> tati[i+2];
        v[tati[i+2]].push_back(i+2);
    }
    constr(1,0,indice);
    for(int i=0;i<m;i++){
        f >> ii >> is;
        if(ii > is)
            swap(ii,is);
        if(ii == is)
            g << tati[ii] << "\n";
        else{
            ii=primaAparitie[ii];
            is=primaAparitie[is];
            lev=level[ii];
            ancestor=euler[ii];
            while(ii <= is){
                if(level[ii] < lev){
                    lev = level[ii];
                    ancestor=euler[ii];
                }
                ii++;
            }
            g << ancestor << '\n';
        }
    }
    return 0;
}