Cod sursa(job #2480973)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 26 octombrie 2019 12:05:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>

#define NMAX 100000
#define LGMAX 20

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

int v[NMAX];

class RMQ {
	private : 
		short logs[1 + NMAX];
		int rmq[LGMAX][NMAX];

	public :
		void calculateLogs ( int N ) {
			logs[1] = 0;
			for ( int i = 2; i <= N; ++i ) 
				logs[i] = 1 + logs[i / 2];
		}

	public :
		void calculateRMQ ( int N ) {
			for ( int i = 0; i < N; ++i )
				rmq[0][i] = v[i];

			for ( int i = 1; i <= logs[N]; ++i )
				for ( int j = 0; j <= N - ( 1 << i ); ++j ) 
					rmq[i][j] = std::min ( rmq[i - 1][j], rmq[i - 1][j + ( 1 << ( i - 1 ) )] );
		}
	public : 
		int minInterval ( int left, int right ) {
			int l = logs[right - left + 1];
			return std::min ( rmq[l][left], rmq[l][right - ( 1 << l ) + 1] );
		}
};

int main () {

	int N, Q;

	fin >> N >> Q;

	for ( int i = 0; i < N; ++i )
		fin >> v[i];

	RMQ* p = new RMQ();

	p -> calculateLogs ( N );
	p -> calculateRMQ ( N );

	for ( int i = 0; i < Q; ++i ) {
		int left, right;
		fin >> left >> right;
		--left;
		--right;
		fout << p -> minInterval ( left, right ) << '\n';
	}

	free ( p );

	return 0;
}