Cod sursa(job #1716350)

Utilizator SmitOanea Smit Andrei Smit Data 12 iunie 2016 16:06:03
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;

vector<int>H[100003];
int n,N,m,T[100003],t[200005],a[200005][30],v[200005],V[200003],niv[200003],poz[100003];

inline void ConMat()
{
    int i,k;
    for(i=1;i<=N;++i)
        a[i][0]=t[i];
    for(k=1;(1<<k)<=N;++k)
        for(i=1;i<=N-(1<<k)+1;++i)
            a[i][k]=min(a[i][k-1],a[i+(1<<(k-1))][k-1]);
    v[1]=0;
    for(i=2;i<=N;++i)
        v[i]=v[i/2]+1;
}

inline int RMQ(int x,int y)
{
    int L,k,sol;
    L=y-x+1;
    k=v[L];
    sol=min(a[x][k],a[y-(1<<k)+1][k]);
    return sol;
}

void DFS(int x,int nivel)
{
    unsigned int i;
    V[x]=1;
    t[++N]=x;
    poz[x]=N;
    niv[N]=nivel;
    for(i=0;i<H[x].size();i++)
        if(V[H[x][i]]==0)
        {
            DFS(H[x][i],nivel+1);
            t[++N]=x;
            niv[N]=nivel;
        }
}

inline void Citire()
{
    int i,x,y,p1,p2;
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    fin>>n>>m;
    for(i=2;i<=n;++i)
    {
        fin>>x;
        H[x].push_back(i);
    }
    ///parcurgere eulariana
    DFS(1,0);
    ///construiesc matricea
    ConMat();
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        p1=poz[x];
        p2=poz[y];
        if(p1>p2)   swap(p1,p2);
        fout<<RMQ(p1,p2)<<"\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    Citire();
    return 0;
}