Cod sursa(job #1930260)

Utilizator RaTonAndrei Raton RaTon Data 18 martie 2017 17:40:46
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#define Max 100001
vector <int> G[Max];
int T[Max], T2[Max], LEV[Max], N;
int H = 200;

void df(int n, int t2, int l){
    vector <int> :: iterator it;
    T2[n] = t2;
    LEV[n] = l;
    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, i, x, y;
    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;
}