Cod sursa(job #3131801)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 21 mai 2023 16:17:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#define power2(x) (1 << (x)) 
using namespace std; 

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

int N, M, a[100005], rmq[20][100005], logaritm[100005];

void formLOG() {
	for (int i = 2; i <= N; i++)
		logaritm[i] = logaritm[i / 2] + 1; 
}

void formareRMQ() {
	for (int i = 1; i <= N; i++)
		rmq[0][i] = i;

	for (int i = 1; power2(i) <= N; i++)
		for (int j = 1; j - power2(i) + 1 <= N; j++) {
			if (a[rmq[i - 1][j]] < a[rmq[i - 1][j + power2(i - 1)]])
				rmq[i][j] = rmq[i - 1][j];
			else
				rmq[i][j] = rmq[i - 1][j + power2(i - 1)];
		}
} 

int query(int x, int y) {
	int lungime = logaritm[y - x + 1]; 

	return min(a[rmq[lungime][x]], a[rmq[lungime][y - power2(lungime) + 1]]);
}

int main()
{
	fin >> N >> M; 
	for (int i = 1; i <= N; i++) 
		fin >> a[i]; 
	
	formLOG(); 
	formareRMQ(); 

	for (int i = 1; i <= M; i++) {
		int x, y;
		fin >> x >> y; 
		fout << query(x, y) << '\n';
	}

	return 0; 
}