Cod sursa(job #1956071)

Utilizator Train1Train1 Train1 Data 6 aprilie 2017 14:33:34
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define NMax 100001
#define MAXNR 999999999
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v [NMax];
vector <pair <int, int> > rEuler;
int x, y, n, m, pos, nr = 1;
int First[NMax];
pair <int, int> val;
void DF(int R, int nivel) {
    rEuler.push_back(make_pair(R, nivel));
    First[R] = nr;
    nr++;
    for(int i = 0; i < v[R].size(); i++) {
        DF(v[R][i], nivel + 1);
        rEuler.push_back(make_pair(R, nivel));
        nr++;
    }
}
int RMQ[33][NMax << 4];
int RMQi[33][NMax << 4];
int main()
{
    fin>>n>>m;
    for(int i = 2; i <= n; i++) {
        fin>>x;
        v[x].push_back(i);
    }
    rEuler.push_back(make_pair(0, 0));
    DF(1, 0);
    nr--;
    for(int i = 1; i <= nr; i++) {
        RMQ[0][i] = rEuler[i].second;
        RMQi[0][i] = rEuler[i].first;
    }
    /*
    nr = 10;
    RMQ[0][1] = 1;
    RMQ[0][2] = 0;
    RMQ[0][3] = 3;
    RMQ[0][4] = -4;
    RMQ[0][5] = 6;
    RMQ[0][6] = 2;
    RMQ[0][7] = 5;
    RMQ[0][8] = 1;
    RMQ[0][9] = 3;
    RMQ[0][10] = 7;
    */

    int p = 1, k;
    cout<<nr<<'\n';
    for(int i = 1; i <= log2(nr) + 1; i++) {
        k = p;
        p = p<<1;
        for(int j = 1; j <= nr - p + 1; j++) {
            if(RMQ[i - 1][j] > RMQ[i - 1][j + k]) {
                RMQ[i][j] = RMQ[i - 1][j + k];
                RMQi[i][j] = RMQi[i - 1][j + k];
            } else {
                RMQ[i][j] = RMQ[i - 1][j];
                RMQi[i][j] = RMQi[i - 1][j];
            }
            //RMQ[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + k]);
            cout<<RMQ[i][j]<<' ';
        }
        cout<<'\n';
    }

    int Left, Right;
    for(int i = 1; i <= m; i++) {
        fin>>x>>y;
        Left = First[x];
        Right = First[y];
        if(First[x] > First[y]) {
            Left = First[y];
            Right = First[x];
        }

        int dif = log2(Right - Left + 1);
        int p = 1<<dif;
        if(RMQ[dif][Left] > RMQ[dif][Right - p + 1]) {
            fout<<RMQi[dif][Right - p];
        } else {
            fout<<RMQi[dif][Left];
        }
        fout<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}