Cod sursa(job #2703190)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 7 februarie 2021 16:04:29
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

using namespace std;

int main() {
    ifstream fin("rmq.in");
    int n, m;
    fin >> n >> m;

    // log[i] = [log2(i)]
    vector<int> log(n + 1, 0);
    for (int i = 2; i <= n; i++) {
        log[i] = log[i >> 1] + 1;
    }

    // rmq[j][i] = min for [i, i + 2 ^ j - 1]
    // rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + 2 ^ j - 2 ^ (j - 1)])
    vector<vector<int> > rmq(log[n] + 1);
    for (int i = 0; i <= log[n]; i++) {
        rmq[i].resize(n + 1);
    }

    for (int i = 1; i <= n; i++) {
        fin >> rmq[0][i];
    }
    for (int j = 1; j <= log[n]; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++) {
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << j) - (1 << (j - 1))]);
        }
    }

    ofstream fout("rmq.out");
    for (int i = 0; i < m; i++) {
        int left, right;
        fin >> left >> right;

        int log_diff = log[right - left + 1];
        int ans = min(
            rmq[log_diff][left],
            rmq[log_diff][right - (1 << log_diff) + 1]
        );

        fout << ans << endl;
    }

    fin.close();
    fout.close();

    return 0;
}