Cod sursa(job #2285936)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 19 noiembrie 2018 16:01:31
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
vector <int> v[100005];
int e[300005],q,niv[100005],n,poz[100005],k=0,r[300005][23],log[300005];
void citire ()
{
    cin>>n>>q;
    for(int i=1;i<n;++i)
    {
        int a;
        cin>>a;
        v[a].push_back(i+1);
    }
    log[1]=0;
    for(int i=2;i<=2*n;++i)
        log[i]=1+log[i/2];
}
void dfs (int nc)
{
    int nn;
    e[++k]=nc;
    poz[nc]=k;
    for(int i=0;i<v[nc].size();++i)
    {
        nn=v[nc][i];
        niv[nn]=niv[nc]+1;
        dfs(nn);
        e[++k]=nc;
    }
}
void frmq ()
{
    int i,j;
    for(i=1;i<=k;++i)
    {
        for(j=0;j<=log[i];++j)
        {
            if(j==0)
                r[i][j]=e[i];
            else
            {
                r[i][j]=r[i][j-1];
                if(niv[r[i-(1<<(j-1))][j-1]]<niv[r[i][j]])
                    r[i][j]=r[i-(1<<(j-1))][j-1];
            }
        }
    }
}
int main()
{
    citire();
    dfs(1);
    frmq();
    for(int i=1;i<=q;++i)
    {
        int a,b;
        cin>>a>>b;
        a=poz[a];
        b=poz[b];
        if(a>b)
            swap(a,b);
        if(niv[r[b][log[b-a+1]]]<niv[r[a+(1<<(log[b-a+1]))-1][log[b-a+1]]])
            cout<<r[b][log[b-a+1]]<<'\n';
        else
            cout<<r[a+(1<<(log[b-a+1]))-1][log[b-a+1]]<<'\n';
    }
    return 0;
}