Cod sursa(job #2124492)

Utilizator albucristianAlbu Cristian-Gabriel albucristian Data 7 februarie 2018 11:41:33
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");
list <int> arb[Nmax];
int lvl[Nmax];
int rmq[20][Nmax<<1];
int Log2[Nmax<<1];
int poz[Nmax];
int N;
void DFS(int x)
{
    rmq[0][++N]=x;
    poz[x]=N;
    for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();++it)
        {
            lvl[*it]=lvl[x]+1;
            DFS(*it);
            rmq[0][++N]=x;
        }
}
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);
    for(i=2;i<=N;i++)
        Log2[i]=Log2[i>>1]+1;
    for(i=1;i<=Log2[N];i++)
        for(j=1;j+(1<<(i-1))<=N;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;
}