Cod sursa(job #2409730)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 19 aprilie 2019 12:55:31
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
int n,m,k,x,y,putere,sx,sy;
int level[100005],euler[400005],strt[100005],p[25],a[400005];
struct str{
    int val,poz;
}rmq[25][100005];
vector<int>v[100005];
void dfs (int nod, int nivel) {
    level[nod] = nivel;

    euler [++k] = nod;

    for (int i = 0; i < v[nod].size(); i ++) {
        int vecin = v[nod][i];
        dfs (vecin,nivel+1);
        euler[++k] = nod;
    }

}

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

    dfs (1,1);

    for (int i = 1; i <= k; i ++) {

        if (strt[euler[i]] == 0) {
            strt[euler[i]] = i;
        }
        rmq[0][i].val = level[euler[i]];
        rmq[0][i].poz = i;
    }

    p[0] = 1;
    p[1] = 2;
    for (int i = 2; i <= 25; i ++) {
        p[i] = p[i-1] * p[i-1];
    }

    for (int i = 2; i <= k; i ++) {
        a[i] = a[i/2] + 1;
    }

    for (int i = 1; i <= 25; i ++) {
        for (int j = 1; j <= k-p[i-1]; j ++) {
            if (rmq[i-1][j].val <= rmq[i-1][j+p[i-1]].val) {
                rmq[i][j] = rmq[i-1][j];
            }
            else {
                rmq[i][j] = rmq[i-1][j+p[i-1]];
            }
        }
    }

    for (int i = 1; i <= m; i ++) {
        in >> x >> y;
        sx = strt[x];
        sy = strt[y];
        if (sx > sy) swap (sx,sy);
        putere = a[sy-sx+1];
        if (rmq[putere][sx].val <= rmq[putere][sy-p[putere]+1].val) {
            out << euler [rmq[putere][sx].poz] <<"\n";
        }
        else {
            out << euler [rmq[putere][sy-p[putere]+1].poz] <<"\n";
        }
    }

    return 0;
}