Cod sursa(job #3140658)

Utilizator cosmin983Pascale Cosmin cosmin983 Data 8 iulie 2023 11:18:31
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
#include <cmath>


using namespace std;


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


const int NMAX = 1e5;


int n, query, a[NMAX], rmq[NMAX][16];


void answerQuery(int left, int right) {
	int log = log2(right - left + 1);
	fout << min(rmq[left][log], rmq[right + 1 - (1 << log)][log]) << '\n';
}


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


void precaculate() {
	for (int i = 0; i < n; ++i) {
		rmq[i][0] = a[i];
	}
	for (int j = 1; j <= log2(n); ++j) {
		for (int i = 0; i + (1 << j) <= n; ++i) {
			rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
		}
	}
}


void solve() {
	int left, right;
	fin >> left >> right;
	answerQuery(left - 1, right - 1);
}


int main() {
	read();
	precaculate();
	while (query--) {
		solve();
	}
	return 0;
}