Cod sursa(job #2753824)

Utilizator ChelaruPaulChelaru Paul ChelaruPaul Data 24 mai 2021 15:42:13
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#include <iostream>

#define ll long long
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int M[100002][20], N, Log2[100002], nrq;

//se calculeaza log2 din numerele de la 1 la N
void log() {
    Log2[1] = 0;
    for (int i = 2; i <= N; ++i)
        Log2[i] = Log2[i / 2] + 1;
}

void proces() {
    // se iau intervalele de la mic la mare
    for (int j = 1; (1 << j) <= N; j++)
        for (int i = 0; i + (1 << j) - 1 < N; i++)
            M[i][j] = min(M[i][j - 1], M[i + (1 << (j - 1))][j - 1]); // intervalul se imparte
}

int query(int L, int R) { // O(1)
    int length = R - L + 1;
    int k = Log2[length];
    return min(M[L][k], M[R - (1 << k) + 1][k]);
}

int main() {
    fin >> N >> nrq;
    for (int i = 0; i < N; i++)
        fin >> M[i][0];    //se initializeaza prima linie de range 1

    log();
    proces();

    for (int i = 0; i < nrq; i++) {
        int s, d;
        fin >> s >> d;
        fout << query(s, d) << '\n';
    }
    return 0;
}