Cod sursa(job #3133589)

Utilizator dariutTache Daria dariut Data 26 mai 2023 10:50:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

int rmq[100000][17], n, m;

ifstream fin("rmq.in");
ofstream fout("rmq.out");


void read() {
    for (int i = 0; i < n; i++) {
        fin >> rmq[i][0];
    }
}

void RMQ() {
    for (int i = 1; i <= int(log2(n)); i++) {
        for (int j = 0; j < n - int(pow(2, i - 1)); j++) {
            int fhalf = rmq[j][i - 1], shalf = rmq[j + int(pow(2, i - 1))][i - 1];
            if (fhalf < shalf) {
                rmq[j][i] = fhalf;
            }
            else {
                rmq[j][i] = shalf;
            }
        }
    }
}

int query(int f, int l) {
    int len = l - f + 1;

    int index = int(log2(len));

    int fnum = rmq[f][index], sum = rmq[l - int(pow(2, index)) + 1][index];

    if (fnum < sum) {
        return fnum;
    }
    return sum;
}

int main() {


    int a, b;
    fin >> n >> m;

    read();
    RMQ();

    for (int i = 0; i < m; i++) {
        fin >> a >> b;
        a--;
        b--;
        fout << query(a, b) << endl;
    }
    fin.close();
    fout.close();
}