Cod sursa(job #2022143)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 15 septembrie 2017 19:45:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> G[Nmax];
int ap[Nmax];
int niv[Nmax];
vector <int> euler;
int a[20][Nmax<<2];
int Log2[Nmax<<2];
void DFS(int x)
{
    euler.push_back(x);
    if(ap[x]==INT_MAX) ap[x]=euler.size()-1;
    list <int> :: iterator it;
    for(it=G[x].begin();it!=G[x].end();it++)
    {
        niv[*it]=niv[x]+1;
        DFS(*it);
        euler.push_back(x);
    }
}
inline int minn(int x, int y)
{
    if(niv[x]<niv[y]) return x;
    else return y;
}
int main()
{
    int n,m,i,j,x,y,k;
    f>>n>>m;
    ap[1]=INT_MAX;
    niv[1]=0;
    for(i=2;i<=n;i++)
    {
        ap[i]=INT_MAX;
        f>>j;
        G[j].push_back(i);
    }
    euler.push_back(0);
    DFS(1);
    int N=*max_element(ap+1,ap+n+1);
    for(i=1;i<=N;i++)
            a[0][i]=euler[i];
    for(i=2;i<=N;i++)
        Log2[i]=Log2[i/2]+1;
    for(i=1;(1<<i)<=N;i++)
        for(j=1;j+(1<<i)<=N+1;j++)
            a[i][j]=minn(a[i-1][j],a[i-1][j+(1<<i-1)]);
    for(;m;--m)
    {
        f>>x>>y;
        if(ap[x]>ap[y]) swap(x,y);
        k=Log2[ap[y]-ap[x]+1];
        g<<minn(a[k][ap[x]],a[k][ap[y]-(1<<k)+1])<<'\n';
    }


    return 0;
}