Cod sursa(job #3144112)

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

using namespace std;

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

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

template<typename T>
class SparseTable{
private:
		T table[N_MAX][LOG_MAX];
		T identityElement{};

		T (* merge)(T, T);

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

		SparseTable(T (* func)(T, T), T _identityElement){
			merge = func;
			identityElement = _identityElement;
		}

		void build(int n, ifstream& fin){
			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){
			T result = identityElement;

			for(int e = LOG_MAX - 1; e >= 0; --e)
				if((1 << e) <= right - left + 1){
					result = merge(result, table[left][e]);
					left += 1 << e;
				}

			return result;
		}
};

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

SparseTable<int> rmq(min, VAL_MAX + 1);

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;
}