Cod sursa(job #2392495)

Utilizator alexandruilieAlex Ilie alexandruilie Data 30 martie 2019 09:07:04
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#define nmax 100005
#include <cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[nmax];
int i,j,nr,x,n,q,niv[2*nmax],vct[2*nmax],fr[nmax],m[2*nmax][20],a,b;
void df(int nod,int nvl)
{
    int i,vec;
    nr++;
    niv[nr]=nvl;
    vct[nr]=nod;
    if(!fr[nod]) fr[nod]=nr;
    for(i=0;i<v[nod].size();++i)
    {
        vec=v[nod][i];
        df(vec,nvl+1);
        nr++;
        niv[nr]=nvl;
        vct[nr]=nod;
    }
}
int main()
{
    f>>n>>q;
    for(i=2;i<=n;i++)
    {
        f>>x;
        v[x].push_back(i);
    }
    df(1,0);
    for(i=1;i<=nr;++i) m[i][0]=i;
    for(j=1;(1<<j)<=nr;++j)
        for(i=1;i+(1<<j)+1<=nr;++i)
        if(niv[m[i][j-1]]<niv[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i][j-1];
        else m[i][j]=m[i+(1<<(j-1))][j-1];
    for(i=1;i<=q;i++)
    {
        f>>a>>b;
        a=fr[a];
        b=fr[b];
        if(a>b) swap(a,b);
        x=log2(b-a+1);
        if(niv[m[a][x]]<niv[m[b-(1<<x)+1][x]]) g<<vct[m[a][x]]<<'\n';
        else g<<vct[m[b-(1<<x)+1][x]]<<'\n';
    }
    return 0;
}