Cod sursa(job #1911659)

Utilizator DobosDobos Paul Dobos Data 7 martie 2017 21:19:15
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
#define NMAX 100005

using namespace std;

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

int L[NMAX],Chain[NMAX],H[NMAX],P[NMAX],chains = 0;

vector < int > G[NMAX];

void DFS(const int &nod){
    int OC = 0;
    H[nod] = 1;
    for(auto const &it : G[nod]){
        L[it] = L[nod] + 1;
        DFS(it);
        H[nod] += H[it];
        P[Chain[it]] = nod;
        if(H[it] > H[OC])
            OC = it;
    }
    if(!OC)
        Chain[nod] = ++chains;
    else
        Chain[nod] = Chain[OC];
}




int LCA(int &x,int &y){



    while(Chain[x] != Chain[y]){
        if(L[P[Chain[x]]] > L[P[Chain[y]]])
            x = P[Chain[x]];
        else
            y = P[Chain[y]];

    }
    if(L[x] < L[y])
        return x;
    return y;
}

int main()

{
    ios :: sync_with_stdio(false);

    int n,m,x,y;

    fin >> n >> m;

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

    DFS(1);
    P[Chain[1]] = 0;
    for(int i = 1; i <= m; i++){
        fin >> x >> y;
        fout << LCA(x,y) << "\n";
    }

    return 0;
}