Cod sursa(job #2165127)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 13 martie 2018 11:13:47
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

vector<int> v[100005];

int n,mm,m[200005][30],a[200005],nrt,viz[200005],w[200005],b[200005];

int interog(int x,int y) {
    int k=log2(y-x+1);
    if (a[m[x][k]]<a[m[y-(1<<k)+1][k]])
        return w[m[x][k]];
    return w[m[y-(1<<k)+1][k]];
}

void df(int k,int nrniv) {
    int i;
    w[++nrt]=k;
    b[k]=nrt;
    a[nrt]=nrniv;
    viz[k]=1;
    for (i=0;i<v[k].size();i++)
        if (!viz[v[k][i]]) {
            df(v[k][i],nrniv+1);
            w[++nrt]=k;
            a[nrt]=nrniv;
            b[k]=nrt;
        }
}

int main() {
    int i,j,x,y;
    f>>n>>mm;
    for (i=2;i<=n;i++) {
        f>>x;
        v[x].push_back(i);
    }
    df(1,0);/*
    for (i=1;i<=nrt;i++)
        cout<<w[i]<<' ';
    cout<<'\n';
    for (i=1;i<=nrt;i++)
        cout<<a[i]<<' ';
    cout<<'\n';
    for (i=1;i<=n;i++)
        cout<<b[i]<<' ';*/
    for (i=1;i<=nrt;i++)
        m[i][0]=i;
    for (j=1;(1<<j)<=nrt;j++)
        for (i=1;i<=nrt-(1<<j)+1;i++)
            if (a[m[i][j-1]]<a[m[i+(1<<(j-1))][j-1]])
                m[i][j]=m[i][j-1];
            else
                m[i][j]=m[i+(1<<(j-1))][j-1];
    for (i=1;i<=mm;i++) {
        f>>x>>y;
        if (b[x]<b[y])
            g<<interog(b[x],b[y])<<'\n';
        else
            g<<interog(b[y],b[x])<<'\n';
    }
    return 0;
}