Cod sursa(job #1197249)

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

FILE *fin, *fout;

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

void citire()
{
    int i,x;
    fscanf(fin, "%d%d", &n, &m);
    for(i=2; i<=n; i++)
    {
        fscanf(fin, "%d", &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()
{
    fin = fopen("lca.in", "r");
    fout = fopen("lca.out", "w");

    citire();
    eul.push_back(0);
    repr_euler(1);
    nivel(1);

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


    fclose(fin); fclose(fout);
    return 0;
}