Cod sursa(job #680574)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 15 februarie 2012 19:12:33
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

typedef struct NOD {
    int inf;
    struct NOD* next;
} NOD;

typedef struct {
    NOD* prim;
} LIST;


#define NMAX 100005
LIST T[NMAX];
int n, m;
int u, v;
int P[NMAX], A[4*NMAX], B[4*NMAX];

void insereaza(LIST* L, int x)
{
    NOD* p=new(NOD);
    p->inf = x;
    p->next = L->prim;
    L->prim = p;
}

void DFS(LIST T[], int x, int p)
{
    static int nr = 0;
    nr++;
    P[x] = nr;
    A[nr] = p;
    B[nr] = x;
    for (NOD* q=T[x].prim; q; q=q->next){
        DFS(T,q->inf,p+1);
        nr++;
        A[nr] = p;
        B[nr] = x;
    }
}

int minim(int l, int r)
{
    if (l>r) swap(l,r);
    int p=l;
    for (int i=l+1; i<=r; i++)
        if (A[p]>A[i]) p = i;
    return B[p];
}

int main()
{
    int x;
    f >> n >> m;
    for (int i=2; i<=n; i++){
        f >> x;
        insereaza (&T[x],i);
    }
    DFS(T,1,0);
    for (;m--;){
        f >> u >> v;
        g << minim(P[u],P[v]) << '\n';
    }
    return 0;
}