Cod sursa(job #2293617)

Utilizator samuelnituNitu Daniel-Samuel samuelnitu Data 1 decembrie 2018 13:00:41
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <climits>
#define NUMBER 1000000
#define LOGNUMBER 20
int M[NUMBER][LOGNUMBER] = {0};
using namespace std;

void CalculateElements(int M[NUMBER][LOGNUMBER], int A[NUMBER], int N){
	int i, j;
	for(i = 0; i < N; i++){
		M[i][0] = i;
	}
	for(j = 1; (1 << j) <= N; j++){
		for(i = 0; 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];
			}
		}
	}
}

int main(){
	int n, m, i, j, k, x, y;
	cin >> n >> m;
	//int **M = new int[n][20];
	int *a = new int[n];
	for(i = 0; i < n; i++){
		cin >> a[i];
	}
	CalculateElements(M, a, n);
	for(i = 0; i < m; i++){
		cin >> x >> y;
		k = floor(log2(y - x + 1));
		if(a[M[x][k]] <= a[M[y - (1 << k) + 1][k]]){
			cout << a[M[x][k]];
		}
		else {
			cout << a[M[y - (1 << k) + 1][k]];
		}
		if(i < m - 1){
			cout << "\n";
		}
	}
	free(a);
}