Cod sursa(job #2811856)

Utilizator mariusn01Marius Nicoli mariusn01 Data 3 decembrie 2021 11:46:31
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 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];
        if (x > y) {
            int aux = x;
            x = y;
            y = aux;
        }
        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;
}