Cod sursa(job #2771819)

Utilizator lucriLuchian Cristian lucri Data 29 august 2021 13:38:42
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<vector<int>>a;
int nr,n,m,vmin[200010][25],rp[25],p[200010],x,y,t[100010],niv[200010],f[100010],v[200010];
void lca(int val,int b)
{
    niv[++nr]=b;
    f[val]=nr;
    v[nr]=val;
    for(auto p:a[val])
    {
        lca(p,b+1);
        niv[++nr]=b;
        v[nr]=val;
    }
    return;
}
int main()
{
    in>>n>>m;
    a.resize(n+5);
    for(int i=2;i<=n;++i)
    {
        in>>t[i];
        a[t[i]].push_back(i);
    }
    rp[0]=1;
    n*=2;
    --n;
    lca(1,1);
    for(int i=1;i<=18;++i)
    {
        rp[i]=rp[i-1]*2;
        if(i<18)
            p[rp[i]]=i;
    }
    for(int i=1;i<=n;++i)
    {
        vmin[i][0]=i;
        if(p[i]==0)
            p[i]=p[i-1];
    }
    for(int j=1;rp[j]<=n;++j)
    {
        for(int i=1;i+rp[j]-1<=n;++i)
            if(niv[vmin[i][j-1]]<niv[vmin[i+rp[j-1]][j-1]])
                vmin[i][j]=vmin[i][j-1];
            else
                vmin[i][j]=vmin[i+rp[j-1]][j-1];
    }
    for(int i=1;i<=m;++i)
    {
        in>>x>>y;
        x=f[x];
        y=f[y];
        if(y<x)
            swap(x,y);
        if(niv[vmin[x][p[y-x+1]]]<niv[vmin[y-rp[p[y-x+1]]+1][p[y-x+1]]])
            out<<v[vmin[x][p[y-x+1]]]<<'\n';
        else
            out<<v[vmin[y-rp[p[y-x+1]]+1][p[y-x+1]]]<<'\n';
    }
    return 0;
}