Cod sursa(job #3144147)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 4 august 2023 21:29:29
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>

#define max_log 20


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

int n,q;

int st[100005];
int dr[100005];
int r[max_log][100005];

vector <int> v[100005];
int p[100005];


bool viz[100005];


int nr;
void dfs(int nod)
{
    viz[nod]=true;
    st[nod]=++nr;
    for(auto& i : v[nod])
        if(!viz[i])
            dfs(i);
    dr[nod]=++nr;
}
void calculate_log()
{
    for(int i=1;i<=n;i++)
        r[0][i]=p[i];
    for(int i=1;i<=max_log;i++)
        for(int j=1;j<=n;j++)
            r[i][j] = r[i-1][r[i-1][j]];

}
bool ancestor(int a,int b)
{
    return st[a]<=st[b] && dr[b] <= dr[a];
}
int lca(int a,int b)
{
    if(ancestor(a,b))
        return a;
    if(ancestor(b,a))
        return b;
    for(int i=max_log;i>=0;i--)
    {
        int nod = r[i][a];
        if(nod>0 && !ancestor(nod,b))
            a=nod;
    }
    return r[0][a];
}


int main()
{
    fin>>n>>q;
    for(int i=2;i<=n;i++)
    {
        fin>>p[i];
        v[p[i]].push_back(i);
    }
    dfs(1);
    calculate_log();
    for(int i=1;i<=q;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<lca(x,y)<<'\n';
    }
}