Cod sursa(job #2956534)

Utilizator SabrinaGiuliaMacoveiciuc Sabrina Giulia SabrinaGiulia Data 19 decembrie 2022 18:44:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
// 1 -> 1e8
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;
const int LGMAX = 17;
const int INF = 1e9;

int N, Q;
int v[NMAX + 1];
// int rasp[NMAX + 1][NMAX + 1]; // raspunsul pentru fiecare pereche ordonata x, y (x <= y)
int rasp[LGMAX][NMAX + 1]; // rasp[i][j] =def= raspunsul pentru secventa [j, j + 2^i)
// pentru i = 0 -> [j, j + 2^0) = [j, j + 1)
// j, j + 1, j + 2, ..., j + (2 ^ i) - 1

// [x..y] -> min([x, x + 2^lg - 1], [y - 2^lg + 1, y])
int lg2[NMAX + 1];

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

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

	// // O(Q * N)
	// for(int tc = 1; tc <= Q; tc++) {
	// 	int x, y; // x = 1, y = N
	// 	fin >> x >> y;

	// 	int mn = INF; // v[x]

	// 	for(int i = x; i <= y; i++) {
	// 		mn = min(mn, v[i]);
	// 	}

	// 	fout << mn << '\n';
	// }

	// 1 <= N <= 1000
	// 1 <= Q <= 1 000 000

	// O(N^2 + Q)

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

	// for(int tc = 1; tc <= Q; tc++) {
	// 	int x, y;
	// 	fin >> x >> y;

	// 	fout << rasp[x][y] << '\n';
	// }

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

	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))]);
		}
	} // min, max, cmmdc

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

	for(int tc = 1; tc <= Q; tc++) {
		int x, y;
		fin >> x >> y;

		int lung = (y - x + 1), lg = lg2[lung];

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