Cod sursa(job #2858228)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 27 februarie 2022 11:49:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int lvl[400005],d[400005][20],n,m,k,euler[400005],x,poz[400005],y,mn,lg;
vector<int>v[100005];
void dfs(int nod,int nivel)
{
    lvl[++k] = nivel;
    euler[k] = nod;

    if(poz[nod] == 0) {
        poz[nod] = k;
    }

    for(int i=0; i<v[nod].size(); i++){
        dfs(v[nod][i],nivel+1);
        lvl[++k] = nivel;
        euler[k] = nod;
    }
}
int main()
{
    int i,j;
    fin >> n >> m;
    for(i=2; i<=n; i++){
        fin >> x;
        v[x].push_back(i);
    }
    dfs(1,0);

    for(i=1; i<=k; i++) {
        d[i][0] = i;
    }

    for(j=1; (1<<j)<=k; j++) {
        for (i = 1; i <= k; i++) {
            if (lvl[d[i][j - 1]] < lvl[d[i + (1 << (j - 1))][j - 1]])
                d[i][j] = d[i][j - 1];
            else d[i][j] = d[i + (1 << (j - 1))][j - 1];
        }
    }

    for(i=1; i<=m; i++){
        fin >> x >> y;
        x = poz[x];
        y = poz[y];
        if(x > y) swap(x,y);
        lg = log2(y - x + 1);
        if(lvl[d[x][lg]] < lvl[d[y-(1<<lg)+1][lg]])
            mn = d[x][lg];
        else mn = d[y-(1<<lg)+1][lg];
        fout << euler[mn] << '\n';
    }
    return 0;
}