Cod sursa(job #2183442)

Utilizator infomaxInfomax infomax Data 23 martie 2018 10:20:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

ifstream F("lca.in");
ofstream G("lca.out");

int n, m, d[20][100005], x, y, lvl[100005], v[100005];
vector<int> a[100005];

void dfs(int nod){
    v[nod]=1;
    for(auto it:a[nod])
        if(!v[it]) lvl[it] = lvl[nod]+1,dfs(it);
}

int lca(int x, int y){
    if(lvl[x]<lvl[y]) swap(x, y);
    int log1, log2;
    for(log1=0; (1<<log1)<=lvl[x]; ++ log1);
    for(log2=0; (1<<log2)<=lvl[y]; ++ log2);

    for(int i = log1; i >= 0; -- i)
        if(lvl[x]-(1<<i)>=lvl[y])
            x = d[i][x];
    if(x==y) return x;

    for(int i = log2; i >= 0; -- i)
        if(d[i][x] && d[i][x]!=d[i][y]){
            x=d[i][x];
            y=d[i][y];
        }
    return d[0][x];
}

int main()
{
    F >> n >> m;
    for(int i = 2; i <= n; ++ i){
        F >> d[0][i];
        a[d[0][i]].push_back(i);
    }
    for(int i = 1; i <= 17; ++ i)
        for(int j = 1; j <= n; ++ j)
            d[i][j]=d[i-1][d[i-1][j]];
    dfs(1);
    while(m--){
        F >> x >> y;
        G << lca(x, y) << '\n';
    }
    return 0;
}