Cod sursa(job #1927157)

Utilizator RaTonAndrei Raton RaTon Data 14 martie 2017 22:53:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[100001], T2[100001], LEV[100001];
int H = 200;
int N;
vector <int> G[100001];
void df(int n, int t2, int l){
    vector <int> :: iterator it;
    int i;
    LEV[n] = l;
    T2[n] = t2;
    if( l % H == 0 )
        t2 = n;
    for(it = G[n].begin(); it != G[n].end(); it++)
        df(*it,t2,l+1);
}

int lca(int x, int y){
    while(T2[x] != T2[y])
        if(LEV[x] > LEV[y])
            x = T2[x];
        else
            y = T2[y];
    while(x != y)
        if(LEV[x] > LEV[y])
            x = T[x];
        else
            y = T[y];
    return x;

}

int main()
{
    int m, x, y, i;
    f >> N >> m;
    for(i = 2; i <= N; i++){
        f >> T[i];
        G[T[i]].push_back(i);
    }
    df(1,1,1);
    for(i = 1; i <= m; i++){
        f >> x >> y;
        g << lca(x, y) << '\n';
    }

    return 0;
}