Cod sursa(job #3321739)

Utilizator Alexbora13Bora Ioan Alexandru Alexbora13 Data 11 noiembrie 2025 10:15:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

const int NMAX = 100000;

int n, m, x,y, cnt;
int parinte[NMAX+1];
vector <int> v[NMAX+1]; 
int nivel[NMAX+1], st[NMAX+1], dr[NMAX+1];
int stramosi[NMAX+1][31];

void dfs(int nod, int nr = 1)
{
    nivel[nod] = nr;
    st[nod] = ++cnt;
    for(auto a : v[nod])
        dfs(a, nr+1);
    dr[nod] = ++cnt;
}

int stramos(int x, int y)//x este stramosul lui y
{
    return st[x] <= st[y] && dr[y] <= dr[x];
}

void calc_stramosi()
{
    for(int i=1; i<=n; i++)
        stramosi[i][0] = parinte[i];
    for(int j=1; j<=20; j++)
    {
        for(int i=1; i<=n; i++)
            stramosi[i][j] = stramosi[stramosi[i][j-1]][j-1];
    }
}

int lca(int x, int y)
{
    if(stramos(x,y))return x;
    if(stramos(y,x))return y;
    //Caut stramosul de adancime minima a lui x care nu este stramos al lui y   
    for(int j=20; j>=0; j--)
    {
        int s = stramosi[x][j];
        if(s != 0 && !stramos(s,y))
            x = s;
    }
    return stramosi[x][0];
}

int main()
{
    fin >> n >> m;
    for(int i=2; i<=n; i++)
    {
        fin >> parinte[i];
        v[parinte[i]].push_back(i); 
    }
    dfs(1);
    cout << stramos(1,5);
    for(int i=1; i<=n; i++)
        cout << st[i] << ' ' << dr[i] << '\n';
    calc_stramosi();
    for(int i=1; i<=m; i++)
    {
        fin >> x >> y;
        fout << lca(x,y) << '\n';
    }
    return 0;
}