Cod sursa(job #574151)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 6 aprilie 2011 21:15:45
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#define pb push_back
#define mp make_pair
#include <stdlib.h>
#define TR(C, i)\
    for(typeof( C.begin() ) i = C.begin(); i != C.end(); i++)

using namespace std;

const int nmax = 100005;
const int mmax = 2000005;
int N, M;

vector<int> A[nmax];
vector< pair<int, int> > Q[mmax];
int P[nmax], S[nmax], Sol[mmax];
bool color[nmax];

void read()
{
    ifstream in("lca.in");

    in >> N >> M;
    int i, a, b;
    for(i = 2; i <= N; i++)
    {
        in >> a;
        A[a]. pb ( i );
    }

    for(i = 1; i <= M; i++)
    {
        in >> a >> b;
        Q[a].pb( mp (b, i) );
        Q[b].pb( mp (a, i) );
    }
}

void Unite(int a, int b)
{
    ( rand() & 1 )? P[a] = b: P[b] = a;
}

int find(int x)
{
    if(x != P[x]) return P[x] = find(P[x]);
    return x;
}

void DF(int u)
{
    P[u] = u;
    S[u] = u;
    TR(A[u], it)
    {
        DF(*it);
        Unite(find(u), find(*it));
        S[find(u)] = u;
    }
    color[u] = true;

    TR(Q[u], it)
        if(color[it -> first])
            Sol[it -> second] = S[find(it -> first)];
}

void ecrire()
{
    ofstream out("lca.out");
    for(int i = 1; i <= M; i++)
        out << Sol[i] << '\n';
}

int main()
{
    read();
    DF(1);
    ecrire();
}