Cod sursa(job #795130)

Utilizator mihai995mihai995 mihai995 Data 7 octombrie 2012 16:49:14
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
#include <vector>
using namespace std;

const int N = 100005, M = 2000005;

struct Pmd{
    int T[N], D[N], S[N];

    Pmd(){
        for (int i = 1 ; i < N ; i++){
            T[i] = S[i] = i;
            D[i] = 1;
        }
    }

    int tata(int x){
        if (T[x] == x)
            return x;

        return T[x] = tata(T[x]);
    }

    void merge(int x, int y){
        x = tata(x);
        y = tata(y);

        if (x == y)
            return;

        if (D[x] > D[y]){
            T[y] = x;
            D[x] += D[y];
        }
        else {
            T[x] = y;
            D[y] += D[x];
        }

        S[y] = S[x];
    }

    int lca(int x){
        return S[tata(x)];
    }
};

Pmd P;
bool use[N];
vector<int> query[N], graph[N];
int ans[M], nrQ;

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

struct Query{
    int x, y, index;

    Query(){
        x = y = index = 0;
    }

    Query(int _x, int _y, int _index){
        x = _x;
        y = _y;
        index = _index;
    }

    void get(int i){
        in >> x >> y;
        index = i;
    }

    bool completed(){
        return use[x] && use[y];
    }

    int get_ans(int X){
        return X == x ? P.lca(y) : P.lca(x);
    }
} Q[M];

void dfs(int x){
    use[x] = true;

    for (vector<int> :: iterator it = query[x].begin() ; it != query[x].end() ; it++)
        if (Q[*it].completed())
            ans[*it] = Q[*it].get_ans(x);

    for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++){
        dfs(*it);
        P.merge(x, *it);
    }
}

int main(){
    int n, x;

    in >> n >> nrQ;

    for (int i = 2 ; i <= n ; i++){
        in >> x;
        graph[x].push_back(i);
    }

    for (int i = 1 ; i <= nrQ ; i++){
        Q[i].get(i);
        query[ Q[i].x ].push_back(i);
        query[ Q[i].y ].push_back(i);
    }

    dfs(1);

    for (int i = 1 ; i <= nrQ ; i++)
        out << ans[i] << "\n";

    return 0;
}