Cod sursa(job #2275384)

Utilizator DovlecelBostan Andrei Dovlecel Data 3 noiembrie 2018 10:05:20
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 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];
    for(int i=1;i<=log2[ne];i++)
        for(int j=1;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];
        k=log2[dr-st-1];
        //sol=min(r[k][st+(1<<k)],r[k][dr]);
        st=r[k][st+(1<<k)];
        dr=r[k][dr];
        if(nivel[st]<nivel[dr])
                sol=st;
            else
                sol=dr;
        out<<sol<<'\n';
    }
    return 0;
}