Cod sursa(job #1992004)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 19 iunie 2017 00:23:49
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> arb[Nmax];
int elr[2*Nmax];
int lvl[Nmax];
int pz[Nmax];
int pp,N;
void DFS(int x, int lv)
{
    elr[++N]=x;
    lvl[x]=lv;
    if(!pz[x]) pz[x]=N;
    for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();it++)
    {
        DFS(*it,lv+1);
        elr[++N]=x;
    }
}
int logg2(int n)
{
    pp=1;
    int nr=0;
    while(pp<=n)
    {
        nr++;
        pp*=2;
    }
    if(pp>n) pp/=2;
    return nr-1;
}
int main()
{
    int n,m,i,x,y,j,p,q,k,nr;
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        arb[x].push_back(i);
    }
    DFS(1,0);
    N=*max_element(pz+1,pz+n+1);
    nr=logg2(N);
    pp=1;
    int D[nr][N];
    for(i=1;i<=N;i++)
    D[0][i]=elr[i];
    for(i=1;i<=nr;i++)
    {
        pp*=2;
        for(j=1;j+pp<=N;j++)
        {
            D[i][j]=D[i-1][j];
            if(lvl[D[i-1][j+pp/2]]<lvl[D[i-1][j]])
                D[i][j]=D[i-1][j+pp/2];
        }
    }
    int ans;
    for(j=1;j<=m;j++)
    {
        f>>x>>y;
        p=pz[x];
        q=pz[y];
        if(q<p) swap(p,q);
        k=logg2(q-p);
        ans=D[k][p];
        if(lvl[ans]>lvl[D[k][y-pp+1]])
            ans=D[k][y-pp+1];
        g<<ans<<'\n';
    }

    return 0;
}