Cod sursa(job #1212171)

Utilizator mariusn01Marius Nicoli mariusn01 Data 23 iulie 2014 22:19:05
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#define DIM 100010

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

vector<int> L[DIM];
int E[2*DIM], N[2*DIM], F[DIM], P[2*DIM];
int D[19][2*DIM];

int n, m, k, x, y, z, i, j;

void euler(int nod, int niv) {
    E[++k] = nod;
    N[k] = niv;
    F[nod] = k;
    for (int i=0;i<L[nod].size();i++) {
        euler(L[nod][i], niv+1);
        E[++k] = nod;
        N[k] = niv;
    }
}

int main() {
    fin>>n>>m;
    for (i=2;i<=n;i++) {
        fin>>x;
        L[x].push_back(i);
    }

    euler(1, 1);

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

    for (i=1;i<=k;i++)
        D[0][i] = i;
    for (i=1;(1<<i)<=k;i++)
        for (j=1;j<=k;j++) {
            D[i][j] = D[i-1][j];
            if ((j+(1<<(i-1)) <= k) && N[ D[i][j] ] > N[ D[i-1][j+(1<<(i-1))] ])
                D[i][j] = D[i-1][j+(1<<(i-1))];
        }

    for (i=1;i<=m;i++) {
        fin>>x>>y;
        x = F[x];
        y = F[y];
        z = P[y-x+1];
        if ( N[ D[z][x] ] < N[  D[z][y-(1<<z)+1] ] ) {
            fout<<E[D[z][x]]<<"\n";
        } else {
            fout<<E[D[z][y-(1<<z)+1]]<<"\n";
        }
    }

    return 0;
}