Cod sursa(job #3003323)

Utilizator zoabaZob Alexandru Mihai zoaba Data 15 martie 2023 17:43:15
Problema Lowest Common Ancestor Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#pragma GCC optimize("O2")
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 100005;
int tata[NMAX],nivel[NMAX];
vector<int>G[NMAX];
int n,m;

void dfs(int nod, int niv)
{
    nivel[nod] = niv;
    for(auto x : G[nod])
        dfs(x,niv+1);
}

int lca(int x, int y)
{
    if(nivel[x] < nivel[y])
        swap(x,y);

    while(nivel[x] > nivel[y])
        x = tata[x];
    while(x!=y)
    {
        x = tata[x];
        y = tata[y];
    }
    return x;
}

int main()
{
    int i,x,y;
    fin >> n >> m;
    for(i=2;i<=n;++i)
    {
        fin >> tata[i];
        G[tata[i]].push_back(i);
    }
    dfs(1,1);
    for(i=1;i<=m;++i)
    {
        fin >> x >> y;
        fout << lca(x,y) << '\n';
    }
    return 0;
}