Cod sursa(job #2275470)

Utilizator DovlecelBostan Andrei Dovlecel Data 3 noiembrie 2018 11:13:57
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <vector>

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

const int N=100001;
const int L=18;
vector<int>f[N];
int n,m,ne,e[2*N],poz[N],nivel[N],root,log2[2*N],r[L][N];

void dfs(int x)
{
    e[++ne]=x;
    poz[x]=ne;
    for(auto y:f[x])
    {
        nivel[y]=1+nivel[x];
        dfs(y);
        e[++ne]=x;
    }
}

int main()
{
    in>>n>>m;
    int x,st,dr,sol,k;

    for(int i=2;i<=2*(n+1);i++)
        log2[i]=1+log2[i/2];

    for(int i=2;i<=n;i++)
    {
        in>>x;
        f[x].push_back(i);
    }
    dfs(1);

    for(int j=1;j<=ne;j++)
    {
        r[0][j]=e[j];
        //out<<r[0][j]<<' ';
    }
    //out<<'\n';
    for(int i=1;i<=log2[ne];i++)
        for(int j=(1<<i);j<=ne;j++)
        {
            st=r[i-1][j-(1<<(i-1))];
            dr=r[i-1][j];
            if(nivel[st]<=nivel[dr])
                r[i][j]=st;
            else
                r[i][j]=dr;
        }

    for(int i=1;i<=m;i++)
    {
        in>>st>>dr;
        st=poz[st];
        dr=poz[dr];
        if(st>dr)
            swap(st,dr);
        //out<<st<<' '<<dr<<' ';
        k=log2[dr-st+1];
        st=r[k][st+(1<<k)-1];
        dr=r[k][dr];
        if(nivel[st]<=nivel[dr])
                sol=st;
            else
                sol=dr;
        out<<sol<<'\n';
    }
    return 0;
}