Cod sursa(job #2084232)

Utilizator giotoPopescu Ioan gioto Data 8 decembrie 2017 20:17:23
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, h;
int H[100005], TT[100005], T2[100005];
vector <int> F[100005];
inline void dfs(int nod, int t2, int lev){
    T2[nod] = t2;
    H[nod] = lev;
    if(lev % h == 0) t2 = nod;
    for(auto it : F[nod])
        dfs(it, t2, lev + 1);
}
inline int lca(int x, int y){
    while(T2[x] != T2[y]){
        if(H[x] > H[y]) x = T2[x];
        else y = T2[y];
    }
    while(x != y){
        if(H[x] > H[y]) x = TT[x];
        else y = TT[y];

    }
}
int main(){
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 2; i <= n ; ++i) {
        scanf("%d", &TT[i]);
        F[TT[i]].push_back(i);
    }
    h = sqrt(n);
    dfs(1, 0, 0);
    int x, y;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d", &x, &y);
        printf("%d\n", lca(x, y));
    }
    return 0;
}