Cod sursa(job #1427203)

Utilizator gabi.cristacheGabi Cristache gabi.cristache Data 1 mai 2015 18:10:24
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 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;
	sqrtN = sqrt(N);

	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;

		for (i = l; (i - 1) % sqrtN != 0; ++i)
			minn = min(minn, v[i]);
		for (i = sqrtLeftIndex + 1 ; i < sqrtRightIndex; ++i)
			minn = min(minn, rmq[i]);
		for (; i <= r; ++i)
			minn = min(minn, v[i]);

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

	return 0;
}