Cod sursa(job #1211541)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 22 iulie 2014 19:56:01
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

int n,m,i,j,x,y,k,lg;
int p[200010],a[20][200010],f[100010],niv[100010];

vector <int> l[100010];

void dfs (int nod,int NIV) {
    a[0][++k]=nod;
    niv[nod]=NIV;
    if (f[nod]==0)
        f[nod]=k;
    for (int i=0;i<l[nod].size();i++) {
        dfs (l[nod][i],NIV+1);
        a[0][++k]=nod;
    }
}

int main () {

    fin>>n>>m;

    for (i=2;i<=n;i++) {
        fin>>x;
        l[x].push_back(i);
    }

    dfs (1,1);

    for (i=2;i<=k;i++)
        p[i]=p[i/2]+1;

    for (i=1;(1<<i)<=k;i++)
        for (j=1;j<=k;j++){
            x = (((1<<(i-1))+j)<=k?((1<<(i-1))+j):j);
            if (niv[a[i-1][j]]<niv[a[i-1][x]])
                a[i][j]=a[i-1][j];
            else
                a[i][j]=a[i-1][x];
        }

    while (m--) {
        fin>>x>>y;
        x=f[x];y=f[y];
        lg=y-x+1;
        if (niv[a[p[lg]][x]]<niv[a[p[lg]][y-(1<<p[lg])+1]])
            fout<<a[p[lg]][x]<<"\n";
        else
            fout<<a[p[lg]][y-(1<<p[lg])+1]<<"\n";
    }

    return 0;
}