Cod sursa(job #3273466)

Utilizator nistor_dora_valentinaNistor Dora Valentina nistor_dora_valentina Data 2 februarie 2025 12:33:20
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, i, j, rmq[21][200005], logg[100005], depth[100005];
vector <int> v[100005];
bool viz[100005];
void dfs(int nod)
{
    viz[nod]=1;
    for(auto i: v[nod])
        if(viz[i]==0)
    {
        depth[i]=depth[nod]+1;
        dfs(i);
    }
}
int lca(int x, int y)
{
    if(depth[x]<depth[y])
        swap(x, y); //x e mai jos decat y
    for(int i=logg[x]; i>=0; i--)
        if(depth[x]-(1<<i)>=depth[y])
            x=rmq[i][x];
    if(x==y)
        return y;
    for(int i=logg[x]; i>=0; i--)
        if(rmq[i][x] && rmq[i][x]!=rmq[i][y])
    {
        x=rmq[i][x];
        y=rmq[i][y];
    }
    return rmq[0][x];
}
int main()
{
    fin>>n>>m;
    for(i=2; i<=n; i++)
    {
        fin>>rmq[0][i];
        v[rmq[0][i]].push_back(i);
    }
    for(i=2; i<=n; i++)
        logg[i]=logg[i/2]+1;
    for(j=1; j<=n; j++)
        for(i=1; i<=20; i++)
        rmq[j][i]=rmq[j-1][rmq[j-1][i]];
    dfs(1);
    while(m--)
    {
        int x, y;
        fin>>x>>y;
        fout<<lca(x, y)<<'\n';
    }
    return 0;
}