Cod sursa(job #2787947)

Utilizator rares89_Dumitriu Rares rares89_ Data 24 octombrie 2021 14:10:02
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
#define LOG 17

using namespace std;

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

int n, v[100005], q, m[100005][LOG];

int query(int x, int y) { // O(1)
    int len = y - x + 1;
    int k = 31 - __builtin_clz(len);
    // x = start, y - 2^k + 1 = final;
    return min(m[x][k], m[y - (1 << k) + 1][k]);
}

int main() {
    fin >> n >> q;
    /// LOG = ceil(log2(n)), care e 17 pt n = 100000
    for(int i = 1; i <= n; i++) {
    	fin >> v[i];
    	// primul min
        m[i][0] = v[i];
    }
    // preprocesare - O(n*log(n))
    for(int k = 1; k < LOG; k++) {
        for(int i = 0; i + (1 << k) - 1 <= n; i++) { // i + 2^k - 1 < n
            m[i][k] = min(m[i][k - 1], m[i + (1 << (k - 1) ) ][k - 1]);
        }
    }
    // queries
    for(int i = 1; i <= q; i++) {
        int x, y;
		fin >> x >> y;
		fout << query(x, y) << "\n";
    }
    fin.close();
    fout.close();
	return 0;
}