Cod sursa(job #3246991)

Utilizator Ilinca_Radu_2022Radu Ilinca-Rucsandra Ilinca_Radu_2022 Data 4 octombrie 2024 23:20:58
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
map<int, int>e, n;
map<int, pair<int, int>>r[35];
vector<int>v[100005];
int k, x, nivel, i, a, b, p[100005], nn, m;
void euler(int x) {
    cout<<x<<' ';
    e[++k]=x;
    n[k]=nivel;
    nivel++;
    for (auto i:v[x]) {
        euler(i);
        e[++k]=x;
        n[k]=nivel-1;
        cout<<x<<' ';
    }
    nivel--;
}
void rmq() {
    int y=1, z=k, x=2, j, i;
    for (i=1; i<=k; i++) {
        r[1][i]={n[i], e[i]};
    }
    while (x<=k) {
        y++;
        for (i=1; i<=z-x; i++) {
            r[y][i]=min(r[y-1][i], r[y-1][i+x]);
        }
        z-=x;
        x*=2;
    }
}
pair<int, int> minim(int i, int j) {
    int x=log2(j-i+1);
    return min(r[x][i], r[x][j-(1<<x)+1]);
}
int main()
{
    fin>>nn>>m;
    for (i=1; i<=nn-1; i++) {
        fin>>x;
        v[x].push_back(i+1);
    }
    cout<<'\n'<<'\n';
    nivel=1;
    euler(1);
    cout<<'\n'<<'\n';
    rmq();
    for (i=1; i<=k; i++) {
        if (p[e[i]]==0) p[e[i]]=i;
    }
    for (i=1; i<=m; i++) {
        fin>>a>>b;
        if (p[a]>p[b]) fout<<minim(p[b], p[a]).second<<'\n';
        else fout<<minim(p[a], p[b]).second<<'\n';
    }
    return 0;
}