Cod sursa(job #1427434)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 2 mai 2015 11:33:44
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <cmath>

#define MaxN 100005

using namespace std;

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

int N, M, sqrtN, v[MaxN], rmq[MaxN], k, r, l;

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

int main() {
	fin >> N >> M;
	
	for (sqrtN = 0; sqrtN * sqrtN <= N; ++sqrtN);
	--sqrtN;

	for (int i = 0; i < N; ++i) {
		fin >> v[i];
		if (i % sqrtN == 0) {
			rmq[i / sqrtN] = v[i];
		} else {
			rmq[i / sqrtN] = min(v[i], rmq[i / sqrtN]);
		}
	}

	for (int j = 0; j < M; ++j) {
		fin >> l >> r;
		--l; --r;
		int minn = ~(1 << 31), i;
		
		int sqrtLeftIndex = l / sqrtN;
		int sqrtRightIndex = r / sqrtN;

		if (sqrtLeftIndex + 1 < sqrtRightIndex) {
			for (k = sqrtLeftIndex + 1; k < sqrtRightIndex; ++k)
				minn = min(minn, rmq[k]);
			for (i = l; i < (sqrtLeftIndex + 1) * sqrtN; ++i)
				minn = min(minn, v[i]);
			for (i = sqrtRightIndex * sqrtN; i <= r; ++i)
				minn = min(minn, v[i]);
		} else {
			for (i = l; i <= r; ++i)	
				minn = min(minn, v[i]);
		}

		fout << minn << '\n';
	}

	return 0;
}