Cod sursa(job #2568683)

Utilizator eusebiu_alexandruMorar Eusebiu eusebiu_alexandru Data 4 martie 2020 09:24:48
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb

#include <fstream>
#include <vector>
#define N 100002
#include <fstream>

using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

vector <int> graph[N];
int rmq[20][N],log[N],nr;
int niv[N],first[N];
bool viz[N];

void eul(int nod)
{
    rmq[0][++nr]=nod;
    first[nod]=nr;
    viz[nod]=1;
    for(int i=0;i<graph[nod].size();++i)
    {
        int vee=graph[nod][i];
        if(!viz[vee])
        {
            niv[vee]=niv[nod]+1;
            eul(vee);
            rmq[0][++nr]=nod;
        }
    }
}
int main()
{
    int n,m,x;
    f>>n>>m;
    for(int i=1;i<n;++i)
    {
        f>>x;
        graph[x].push_back(i+1);
    }
    eul(1);
    log[0]=-1;
    for(int i=1;i<=nr;++i) log[i]=1+log[i/2];
    int p=1;
    for(int i=1;i<=log[nr];++i)
    {
        for(int j=1;j+p<=nr;++j)
        {
            int n1=rmq[i-1][j],n2=rmq[i-1][j+p];
            if(niv[n1]>niv[n2]) rmq[i][j]=n2;
            else rmq[i][j]=n1;
        }
        p*=2;
    }
    int a,b,dif,lin,sol;
    while(m--)
    {
        f>>a>>b;
        a=first[a];
        b=first[b];
        if(a>b) swap(a,b);
        dif=b-a+1;
        lin=log[dif];
        p=(1<<lin);
        int n1=rmq[lin][a],n2=rmq[lin][b-p+1];
        if(niv[n1]>niv[n2]) sol=n2;
        else sol=n1;
        g<<sol<<'\n';
    }
    f.close();
    g.close();
    return 0;
}