Cod sursa(job #2134171)

Utilizator eduardandrei20Nechifor Eduard Andrei eduardandrei20 Data 17 februarie 2018 18:18:10
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> arb[Nmax];
int lvl[Nmax];
int rmq[20][Nmax<<1];
int Log2[Nmax<<1];
int poz[Nmax];
int N;
void DFS(int x,int nivel)
{
    rmq[0][++N]=x;
    poz[x]=N;
    lvl[x]=nivel;
    for(size_t y = 0 ; y < arb[x].size(); ++y)
    {
        DFS(arb[x][y],nivel+1);
        rmq[0][++N]=x;
        lvl[x]=nivel;

    }

}
int main()
{
    int n,m,i,j,x,y,k;
    f>>n>>m;
    for(i=2;i<=n;i++)
    {
        f>>x;
        arb[x].push_back(i);
    }
    DFS(1,0);
    for(i=2;i<=N;i++)
        Log2[i]=Log2[i>>1]+1;
    for(i=1;i<=Log2[N];i++)
        for(j=1;j<=N-(1<<(i-1));j++)
        {
            if(lvl[rmq[i-1][j]]>lvl[rmq[i-1][j+(1<<(i-1))]])
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
            else
                rmq[i][j]=rmq[i-1][j];
        }
    while(m--)
    {
        f>>x>>y;
        x=poz[x];
        y=poz[y];
        if(y<x) swap(x,y);
        k=Log2[y-x+1];
        if(lvl[rmq[k][x]]>lvl[rmq[k][y-(1<<k)+1]])
            g<<rmq[k][y-(1<<k)+1]<<'\n';
        else
            g<<rmq[k][x]<<'\n';
    }

    return 0;
}