Cod sursa(job #1715348)

Utilizator SmitOanea Smit Andrei Smit Data 10 iunie 2016 13:47:44
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 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];

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;
}

inline void DFS(int x)
{
    unsigned int i;
    int y;
    if(H[x].size()>=1)
        t[++N]=x;
    for(i=0;i<H[x].size();++i)
    {
        y=H[x][i];
        DFS(y);
        t[++N]=x;
    }

}

inline int PrimaPoz(int x)
{
    int i;
    for(i=1;i<=N;++i)
        if(t[i]==x)
            return i;
    return -1;
}

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);
    for(i=1;i<=N;++i)
        cout<<t[i]<<" ";
    cout<<"\n";
    cout<<"\n\n";
    cout<<H[10].size();////////////////////////
    ///construiesc matricea
    ConMat();
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        p1=PrimaPoz(x);
        p2=PrimaPoz(y);
        if(p1>p2)   swap(p1,p2);
        fout<<RMQ(p1,p2)<<"\n";
    }
    fin.close();
    fout.close();
}

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