Cod sursa(job #2974769)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 4 februarie 2023 16:30:50
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;
const int LOGMAX = 17;

int N, M;
int v[NMAX + 1];
int rasp[LOGMAX + 1][NMAX + 1];
int lg2[NMAX + 1];

int main() {
	fin >> N >> M;

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

	for(int j = 1; j <= N; j++) {
		rasp[0][j] = v[j];
	}
	for(int i = 1; (1 << i) <= N; i++) {
		for(int j = 1; j + (1 << i) - 1 <= N; j++) {
			rasp[i][j] = min(rasp[i - 1][j], rasp[i - 1][j + (1 << (i - 1))]);
		}
	}

	lg2[1] = 0;
	for(int i = 2; i <= N; i++) {
		lg2[i] = lg2[i / 2] + 1;
	}

	for(int i = 1; i <= M; i++) {
		int x, y;
		fin >> x >> y;

		int lg = y - x + 1;
		// int k = __lg(lg);
		int k = lg2[lg];

		fout << min(rasp[k][x], rasp[k][y - (1 << k) + 1]) << '\n';
	}
	return 0;
}