Cod sursa(job #1927128)

Utilizator RaTonAndrei Raton RaTon Data 14 martie 2017 22:29:07
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int T[100001], T2[100001], LEV[100001];
int H = 500;
int N;
void df(int n, int t2, int l){
    int i;
    LEV[n] = l;
    T2[n] = t2;
    if( l % H == 0 )
        t2 = n;
    for(i = 1; i <= N; i++)
        if(T[i] == n)
            df(i,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];
    df(1,1,1);
    for(i = 1; i <= m; i++){
        f >> x >> y;
        g << lca(x, y) << '\n';
    }

    return 0;
}