Cod sursa(job #1427302)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 1 mai 2015 21:33:20
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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;
//		fout << "boundaries:\t";
//		fout << l << '\t' << r << '\n';
		int minn = ~(1 << 31), i;
		
		int sqrtLeftIndex = l / sqrtN;
		int sqrtRightIndex = r / sqrtN;

//		fout << "indexes traversed:\t";
		for (i = l; i < (sqrtLeftIndex + 1) * sqrtN; ++i) {
//			fout << i << ' ';
			minn = min(minn, v[i]);
		}
		for (k = sqrtLeftIndex + 1; k < sqrtRightIndex; ++k) {
//			fout << "[ " << k * sqrtN << ", " << (k + 1) * sqrtN - 1 << " ] ";
			minn = min(minn, rmq[k]);
		}
		
		i = sqrtLeftIndex == sqrtRightIndex ? i : sqrtRightIndex * sqrtN;
		for (; i <= r; ++i) {
			//fout << i << ' ';
			minn = min(minn, v[i]);
		}
/*
		fout << "\nsqrtRightIndex = " << sqrtRightIndex << '\n';

		fout << "\nresult:\t";
*/
		fout << minn << '\n';

	}

	return 0;
}