Cod sursa(job #3144114)

Utilizator daristyleBejan Darius-Ramon daristyle Data 4 august 2023 13:42:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;

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

const int N_MAX = 1e5;
const int LOG_MAX = 17;

template<typename T>
class OptimizedSparseTable{
private:
		T table[N_MAX][LOG_MAX];
		char lb[N_MAX + 1];

		T (* merge)(T, T);

public:
		OptimizedSparseTable(T (* func)(T, T)){
			merge = func;
		}

		void build(int n, ifstream& fin){
			lb[1] = 0;
			for(int i = 2; i <= n; ++i)
				lb[i] = lb[i / 2] + 1;

			for(int i = 0; i < n; ++i)
				fin >> table[i][0];

			for(int e = 1; e < LOG_MAX; ++e)
				for(int i = 0; i < n - (1 << (e - 1)); ++i)
					table[i][e] = merge(table[i][e - 1], table[i + (1 << (e - 1))][e - 1]);
		}

		T query(int left, int right){
			int e = lb[right - left + 1];
			T result = merge(table[left][e], table[right - (1 << e) + 1][e]);

			return result;
		}
};

int min(int a, int b){
	return (a < b) ? a : b;
}

OptimizedSparseTable<int> rmq(min);

int main(){
	int n, queries, left, right;
	fin >> n >> queries;

	rmq.build(n, fin);

	for(int i = 0; i < queries; ++i){
		fin >> left >> right;

		fout << rmq.query(left - 1, right - 1) << '\n';
	}

	fin.close();
	fout.close();
	return 0;
}