Cod sursa(job #1952991)

Utilizator nicu_serteSerte Nicu nicu_serte Data 4 aprilie 2017 15:57:31
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define nmax 100005
int n, m, t[nmax], index[nmax];
vector <int> eul, niv, g[nmax];
bool viz[nmax]={0};
void citireArb()
{
    int i;
    fin>>n>>m;
    for(i=2; i<=n; i++)
        fin>>t[i];
}
void build()
{
    int i;
    for(i=1; i<=n; i++)
        if(t[i])
        {
            g[i].push_back(t[i]);
            g[t[i]].push_back(i);
        }
}
void dfs(int nod, int level)
{
    vector<int>::iterator it;
    viz[nod]=1;
    eul.push_back(nod);
    index[nod]=eul.size()-1;
    niv.push_back(level);
    for(it=g[nod].begin(); it!=g[nod].end(); it++)
        if(!viz[*it] && t[nod]!=*it)
        {
            dfs(*it, level+1);
            eul.push_back(nod);
            niv.push_back(level);
        }
}
int minim(int x, int y)
{
    int i, j, mn, r=0;
    i=index[x];
    j=index[y];
    if(i>j)
    {
        mn=i;
        i=j;
        j=mn;
    }
    mn=nmax;
    for(;i<=j;i++)
        if(niv[i]<mn)
        {
            mn=niv[i];
            r=eul[i];
        }
    return r;
}
int main()
{
    int x, y;
    citireArb();
    build();
    dfs(1, 0);
    while(m)
    {
        m--;
        fin>>x>>y;
        fout<<minim(x, y)<<'\n';
    }
    return 0;
}