Cod sursa(job #2566199)

Utilizator bodea.georgianaBodea Georgiana bodea.georgiana Data 2 martie 2020 19:27:33
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <vector>
#define N 100002
#include <iostream>

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

vector <int> graph[N];
int euler[3*N],niv[N],first[N],arb[1<<18],nr,x,poz,a,b,sol;
bool viz[N];

void solve(int st, int dr, int nod)
{
    if(a<=st && dr<=b)
    {
        if(niv[sol]>niv[arb[nod]])
            sol=arb[nod];
    }
    else
    {
        int mij=(st+dr)/2;
        if(a<=mij) solve(st,mij,2*nod);
        if(mij<b) solve(mij+1,dr,2*nod+1);
    }
}
void update(int st, int dr, int nod)
{
    if(st==dr)
        arb[nod]=x;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij) update(st,mij,2*nod);
        else update(mij+1,dr,2*nod+1);
        int fs=arb[2*nod],fd=arb[2*nod+1];
        if(niv[fs]>niv[fd])
            arb[nod]=fd;
        else
            arb[nod]=fs;
    }
}
void eul(int nod)
{
    viz[nod]=1;
    euler[++nr]=nod;
    first[nod]=nr;
    for(int i=0;i<graph[nod].size();++i)
    {
        int vee=graph[nod][i];
        if(!viz[vee])
        {
            niv[vee]=niv[nod]+1;
            eul(vee);
            euler[++nr]=nod;
        }
    }
}
int main()
{
    int n,m;
    f>>n>>m;
    for(int i=1;i<n;++i)
    {
        f>>x;
        graph[x].push_back(i+1);
    }
    eul(1);
    for(int i=1;i<=nr;++i)
    {
        poz=i;
        x=euler[i];
        update(1,nr,1);
    }
    niv[0]=2000000000;
    while(m--)
    {
        f>>a>>b;
        a=first[a];
        b=first[b];
        if(a>b) swap(a,b);
        sol=0;
        solve(1,nr,1);
        g<<sol<<'\n';
    }
    f.close();
    g.close();
    return 0;
}