Cod sursa(job #1784771)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 20 octombrie 2016 14:59:46
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX  100001
#define SNMAX 317

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], A_MIN[SNMAX];
int n, m;

void Update(int B)
{
	int L = sqrt(n);
	int minim = A[B*L + 1];
	for (int i = B*L + 1; i <= (B + 1) * L && i <= n; ++i)
		minim = min(minim, A[i]);
	A_MIN[B + 1] = minim;
}

int main()
{
	in >> n >> m;
	for (int i = 1; i <= n; ++i)
		in >> A[i];
	int L = sqrt(n);
	int length = L;
	if (double(L) < sqrt(n))
		L++;
	for (int i = 1; i <= L; ++i)
		Update(i - 1);
	int x, y, minn;
	for (int i = 1; i <= m; ++i)
	{
		in >> x >> y;
		minn = A[x];
		for (int j = x; j <= y; j++)
		{
			if ((j - 1) % length == 0 && x + length - 1 <= y)
			{
				if (minn > A_MIN[(j - 1) / length + 1])
					minn = A_MIN[(j - 1) / length + 1];
				j += length - 1;
			}
			else
			{
				if (minn > A[j])
					minn = A[j];
			}
		}
		out << minn << "\n";
	}
	in.close();
	out.close();
	return 0;
}