Cod sursa(job #3004810)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 16 martie 2023 16:59:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#define dim 100001
#define maxl 19
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n, crt=0;
vector <int> l[dim];
int ps[dim], pe[dim], stramos[maxl][dim], tata[dim];

void dfs(int nod)
{
    crt++;
    ps[nod]=crt;
    for(int i=0;i<l[nod].size();i++)
    {
        dfs(l[nod][i]);
    }
    crt++;
    pe[nod]=crt;
}

int estramos(int x, int y)
{
    return ps[x]<=ps[y]&&pe[y]<=pe[x];
}

void calcstramos()
{
    for(int i=1;i<=n;i++)
    {
        stramos[0][i]=tata[i];
    }
    for(int p=1;p<maxl;p++)
    {
        for(int i=1;i<=n;i++)
        {
            stramos[p][i]=stramos[p-1][stramos[p-1][i]];
        }
    }
}

int lca(int x, int y)
{
    if(estramos(x, y)==1)
    {
        return x;
    }
    if(estramos(y, x)==1)
    {
        return y;
    }
    int z;
    for(int p=maxl-1;p>=0;p--)
    {
        z=stramos[p][x];
        if(z!=0&&estramos(z, y)==0)
        {
            x=z;
        }
    }
    return stramos[0][x];
}

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