Cod sursa(job #2524988)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 16 ianuarie 2020 17:53:07
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 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],ai[1<<20];
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;
    }
}

void Build(int nod,int st,int dr)
{   if(st==dr)
    {   ai[nod]=st;
        return;
    }
    int mij=(st+dr)/2;
    Build(2*nod,st,mij);
    Build(2*nod+1,mij+1,dr);
    ai[nod]=Minim(ai[2*nod],ai[2*nod+1]);
}

int Query(int nod,int st,int dr,int x,int y)
{   if(st>=x && dr<=y)
        return ai[nod];
    int mij=(st+dr)/2;
    int i=k+1,j=k+1;
    if(x<=mij)
        i=Query(2*nod,st,mij,x,y);
    if(mij<y)
        j=Query(2*nod+1,mij+1,dr,x,y);
    return Minim(i,j);
}

int main()
{   f>>n>>m;
    for(int x,i=2; i<=n; i++)
    {   f>>x;
        v[x].push_back(i);
    }
    Euler(1,1);
    Build(1,1,k);
    l[k+1]=1<<30;
    for(int x,y; f>>x>>y;)
    {   x=poz[x];
        y=poz[y];
        if(x>y)
            swap(x,y);
        g<<e[Query(1,1,k,x,y)]<<'\n';
    }

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