Cod sursa(job #2703191)

Utilizator vnedelcuVictor Andrei Nedelcu vnedelcu Data 7 februarie 2021 16:22:00
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int LG_MAX = 19;
const int N_MAX = 100001;

// 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)])
int rmq[LG_MAX][N_MAX];

// lg[i] = [log2(i)]
int lg[N_MAX];

int main() {
    FILE *  fin, * fout;

    fin = fopen("rmq.in", "r");
    int n, m;
    fscanf(fin, "%d %d", &n, &m);

    for (int i = 2; i <= n; i++) {
        lg[i] = lg[i >> 1] + 1;
    }

    for (int i = 1; i <= n; i++) {
        fscanf(fin, "%d", &rmq[0][i]);
    }
    for (int j = 1; j <= lg[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))]);
        }
    }

    fout = fopen("rmq.out", "w");
    for (int i = 0; i < m; i++) {
        int left, right;
        fscanf(fin, "%d %d", &left, &right);

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

        fprintf(fout, "%d\n", ans);
    }

    fclose(fin);
    fclose(fout);

    return 0;
}