Cod sursa(job #2301383)

Utilizator popescu.octavianPopescu Octavian popescu.octavian Data 12 decembrie 2018 21:21:56
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define Min(a, b) (a < b) ? a : b

using namespace std;


void ReadInputSpT(int &N, int &M, vector<int> &v, vector<vector<int>> &SparseTable, vector<int> &log_2, istream &f) {
    f >> N >> M;

    int value;

    log_2.push_back(-1);
    for(int i = 1; i <= N; i++) {
        log_2.push_back(log_2[i / 2] + 1);
    }
    SparseTable.assign(N, vector<int>(log_2[N] + 1));
    for(int i = 0; i < N; i++) {
        f >> value;
        v.push_back(value);
        SparseTable[i][0] = i;
    }
}

void PrecomputeSpT(int N, vector<int> &v, vector<vector<int>> &SparseTable) {
    for(int j = 1; (1 << j) <= N; j++)
        for(int i = 0; i + (1 << j) - 1 < N; i++) {
            if (v[SparseTable[i][j - 1]] <= v[SparseTable[i + (1 << (j - 1))][j - 1]]) {
                SparseTable[i][j] = SparseTable[i][j - 1];
            } else {
                SparseTable[i][j] = SparseTable[i + (1 << (j - 1))][j - 1];
            }
        }
}
void PrintOutputSpT(int M, vector<int> &v, vector<int> &log_2, vector<vector<int>> &SparseTable, istream &f, ostream &g) {
    int left, right;

    for(int i = 0; i < M; i++) {
        f >> left >> right;
        left--;
        right--;
        int lg = log_2[right - left + 1];
        int solution = Min(v[SparseTable[left][lg]], v[SparseTable[right - (1 << lg) + 1][lg]]);

        g << solution << "\n";
    }
}
int main()
{
    ifstream f;
    f.open("rmq.in");

    ofstream g;
    g.open("rmq.out");

    int N, M;
    vector<int> log_2, v;
    vector<vector<int>> SparseTable;

    ReadInputSpT(N, M, v, SparseTable, log_2, f);
    PrecomputeSpT(N, v, SparseTable);
    PrintOutputSpT(M, v, log_2, SparseTable, f, g);

    f.close();
    g.close();
    return 0;
}