Cod sursa(job #2833982)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 16 ianuarie 2022 10:26:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>

using namespace std;

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

#define DIM 100005

int rmq[20][DIM];
int N, M;

int main() {

    fin >> N >> M;

    for(int i = 1; i <= N; i++) {
        fin >> rmq[0][i];
    }

    for(int exp = 1, lungime = 2; lungime <= N; lungime *= 2, exp++) {
        for(int i = lungime; i <= N; i++) {

            rmq[exp][i] = min(rmq[exp - 1][i - lungime / 2],
                              rmq[exp - 1][i]);
        }
    }

    int x, y;
    while(M--) {
        fin >> x >> y;

        if(x > y) swap(x, y);

        int put = 1, e = 0;
        while(put <= y - x + 1) put *= 2, e++;
        put /= 2, e--;

        fout << min(rmq[e][x + put - 1], rmq[e][y]) << '\n';
    }

    return 0;
}