Cod sursa(job #1197244)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 11 iunie 2014 13:47:25
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#include <utility>
#define MX 100001
#define minim(a,b) ((a<b) ? a : b)
using namespace std;

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

int n,m;
vector<int> c[MX];
vector<int> eul;
int niv[MX], ap[MX];
int nr1,nr2;

void citire()
{
    int i,x;
    fin>>n>>m;
    for(i=2; i<=n; i++)
    {
        fin>>x;
        c[x].push_back(i);
    }
}

void repr_euler(int p)
{
    vector<int>::iterator it;
    eul.push_back(p);

    if(ap[p] == 0)
    {
        ap[p] = eul.size()-1;
    }

    for(it=c[p].begin(); it!=c[p].end(); it++)
    {
        repr_euler(*it);
        eul.push_back(p);
    }
}

void nivel(int p)
{
    vector<int>::iterator it;
    for(it=c[p].begin(); it!=c[p].end(); it++)
    {
        niv[*it] = niv[p]+1;
        nivel(*it);
    }
}

void afisare()
{
    vector<int>::iterator it;
    it = eul.begin(); it++;
    for(; it!=eul.end(); it++) fout<<*it<<' ';
    fout<<'\n';

    it = eul.begin(); it++;
    for(; it!=eul.end(); it++) fout<<niv[*it]<<' ';

    fout<<'\n'<<ap[3];
}

int lca()
{
    int a,b,m,i,x,t;
    a = ap[nr1];
    b = ap[nr2];
    m = 2000000;

    for(; a<=b; a++)
    {
        i = eul[a];
        x = minim(m, niv[i]);
        if(x < m)
        {
            m = x;
            t = i;
        }
    }
    return t;

}

int main()
{
    citire();
    eul.push_back(0);
    repr_euler(1);
    nivel(1);

    //afisare();
    int i;
    for(i=1; i<=m; i++)
    {
        fin>>nr1>>nr2;
        if(ap[nr1] > ap[nr2]) swap(nr1, nr2);
        fout<<lca()<<'\n';
    }


    fin.close(); fout.close();
    return 0;
}