Cod sursa(job #2078518)

Utilizator bcrisBianca Cristina bcris Data 29 noiembrie 2017 18:04:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <math.h>
#include <iostream>

using namespace std;

#define NMAX 100001
#define LMAX 18
int n, m;
int A[NMAX];
int M[NMAX][LMAX];



int main() {

	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++) {
		scanf("%d ", &A[i]);
	}


	for (int i = 1; i <= n; i++) {
		M[i][0] = i;
	}

	for (int j = 1; 1 << j <= n; j++) {
		for (int i = 1; i + (1 << (j - 1)) <= n; i++) {
			if (A[M[i][j - 1]] <= A[M[i + (1 << (j - 1))][j - 1]]) {
				M[i][j] = M[i][j - 1];
			} else {
				M[i][j] = M[i + (1 << (j - 1))][j - 1];
			}
		}
	}

	// for (int i = 1; i <= n; i++) {
	// 	for (int j = 0; 1 << j <= n; j++) {
	// 		cout << M[i][j] << " ";
	// 	}
	// 	cout << "\n";
	// }


	int x, y;

	for (int t = 1; t <= m; t++) {
		scanf("%d %d\n", &x, &y);
		int k = log2(y - x + 1);
		// cout << "k " << k << "\n";
		// cout << A[M[x][k]] << " " << A[M[y - (1 << k) + 1][k]] << "\n";
		int rmq = min(A[M[x][k]], A[M[y - (1 << k) + 1][k]]);

		printf("%d\n", rmq);
	} 

	

	return 0;
}