Cod sursa(job #2525670)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 17 ianuarie 2020 17:34:01
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define mp make_pair
#define Minim(i,j) l[i]<l[j] ? i : j
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");

int n,m,k;

int poz[1<<17],e[1<<18],l[1<<18],lg[1<<18],dp[18][1<<18];
vector <int> v[1<<17];

void Euler(int nod,int niv)
{   e[++k]=nod;
    l[k]=niv;
    poz[nod]=k;
    for(int i=0; i<v[nod].size(); i++)
    {   Euler(v[nod][i],niv+1);
        e[++k]=nod;
        l[k]=niv;
    }
}

int main()
{   f>>n>>m;
    for(int x,i=2; i<=n; i++)
    {   f>>x;
        v[x].push_back(i);
    }
    Euler(1,1);
    for(int i=1; i<=k; i++)
        dp[0][i]=i;
    for(int i=2; i<=(1<<18); i++) lg[i]=lg[i/2]+1;
    int z=lg[k];
    for(int i=1; i<=z; i++)
        for(int j=1; j<=k-(1<<(i-1)); j++)
            dp[i][j]=Minim(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
    for(int x,y; f>>x>>y;)
    {   x=poz[x];
        y=poz[y];
        if(x>y)
            swap(x,y);
        int z=lg[y-x];
        g<<e[Minim(dp[z][x],dp[z][y-(1<<z)+1])]<<'\n';
    }

    f.close(); g.close(); return 0;
}