Cod sursa(job #2939568)

Utilizator average_disappointmentManolache Sebastian average_disappointment Data 13 noiembrie 2022 21:54:06
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

const int nmax = 1e5, logn = 17;
int n, m, v[nmax + 1], ezlog[nmax + 1], rmq[nmax + 1][logn + 1];

int query(int i, int j) {

	int len = ezlog[j - i + 1];

	if (v[rmq[i][len]] <= v[rmq[j - (1 << len) + 1][len]])
		return rmq[i][len];
	return rmq[j - (1 << len) + 1][len];
}

int main() {

	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i];

	ezlog[0] = -1;
	for (int i = 1; i <= nmax; i++)
		ezlog[i] = ezlog[i / 2] + 1;

	for (int i = 1; i <= n; i++)
		rmq[i][0] = i;

	for (int j = 1; (1 << j) <= n; j++) {

		for (int i = 1; i + (1 << j) - 1 <= n; i++) {

			if (v[rmq[i][j - 1]] < v[rmq[i + (1 << (j - 1))][j - 1]])
				rmq[i][j] = rmq[i][j - 1];
			else
				rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
		}
	}

	for (int i = 1; i <= m; i++) {

		int x, y;
		cin >> x >> y;

		cout << v[query(x, y)] << "\n";
	}
}