Cod sursa(job #3233067)

Utilizator Ilinca_Radu_2022Radu Ilinca-Rucsandra Ilinca_Radu_2022 Data 2 iunie 2024 13:15:07
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, x, t, euler[2*100005], prima[100005], nivel[100005], i, j, y;
vector<int>v[100005];
pair<int, int>dp[100005][25];
void dfs(int nod, int prec) {
    euler[++t]=nod;
    prima[nod]=t;
    nivel[nod]=nivel[prec]+1;
    for (int i:v[nod]) {
        if (i!=prec) {dfs(i, nod); euler[++t]=nod;}
    }
}
int query(int a, int b) {
    int lg=log2(b-a+1);
    if (dp[lg][a].first<dp[lg][b-(1<<lg)+1].first) return dp[lg][a].second;
    else return dp[lg][b-(1<<lg)+1].second;
}
int main()
{
    fin>>n>>q;
    for (i=2; i<=n; i++) {
        fin>>x;
        v[i].push_back(x);
        v[x].push_back(i);
    }
    dfs(1, 0);
    for (i=1; i<=t; i++) {
        dp[0][i]={nivel[euler[i]], euler[i]};
    }
    for (i=1; i<=20; i++) {
        for (j=1; j<=t-(1<<i)+1; j++) {
            if (dp[i-1][j].first<dp[i-1][j+(1<<(i-1))].first) {
                dp[i][j]=dp[i-1][j];
            }
            else dp[i][j]=dp[i-1][j+(1<<(i-1))];
        }
    }
    cout<<prima[10]<<' '<<prima[11];
    while (q--) {
        fin>>x>>y;
        x=prima[x];
        y=prima[y];
        if (x>y) swap(x, y);
        fout<<query(x, y)<<'\n';
    }
    return 0;
}