Cod sursa(job #403916)

Utilizator cristiprgPrigoana Cristian cristiprg Data 25 februarie 2010 16:11:25
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define DIM 100005
int t[DIM], euler[DIM], grad[DIM], n, m, v[DIM], E, poz[DIM];

vector <int> F[DIM];

void _euler(int i, int gr)
{
    grad[++E] = gr;
    euler[E] = i;
    v[i] = 1;

    if (!poz[i])
        poz[i] = E;

    for (vector <int>::iterator it = F[i].begin(); it != F[i].end(); ++it)
        if(!v[*it])
            _euler(*it, gr+1),  euler[++E] = i, grad[E] = gr;

}

int LCA(int x, int y)
{
    int ibun = -1, st = poz[x], dr = poz[y];

    if (dr < st) {int aux = dr; dr = st, st = aux;}

    for (int i = st, min = 1<<30; i <= dr; ++i)
        if (grad[i] < min)
            min = grad[i], ibun = i;

    return euler[ibun];
}

int main()
{
    FILE *f = fopen("lca.in", "r"), *fout = fopen("lca.out", "w");
    fscanf(f, "%d%d", &n, &m);
    for (int i = 2; i <= n; ++i)
        fscanf(f, "%d", &t[i]), F[t[i]].pb(i);

    _euler(1, 0);/*
    for (int i = 1; i <= E; ++i)
       printf ("%2d ",i);
    printf ("\n");
    for (int i = 1; i <= E; ++i)
        printf ("%2d ", euler[i]);
    printf ("\n");
    for (int i = 1; i <= E; ++i)
        printf ("%2d ", grad[i]);
    printf ("\n");
*/

    for (int x, y; m; --m)
        fscanf(f, "%d%d", &x, &y),fprintf (fout,"%d\n", LCA(x, y));


    fclose(f);
    fclose(fout);

    return 0;
}