Cod sursa(job #1784810)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 20 octombrie 2016 15:22:17
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX  100001
#define SNMAX 317
#define BUFF_SIZE 100000

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], A_MIN[SNMAX];
int n, m;
char BUFF[BUFF_SIZE];
int pos = 0;

void Read(int &a)
{
	while (!isdigit(BUFF[pos]))
		if (++pos == BUFF_SIZE)
			in.read(BUFF, BUFF_SIZE), pos = 0;
	a = 0;
	while (isdigit(BUFF[pos]))
	{
		a = a * 10 + (BUFF[pos] - '0');
		if (++pos == BUFF_SIZE)
			in.read(BUFF, BUFF_SIZE), pos = 0;
	}
}

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()
{
	Read(n); 
	Read(m);
	for (int i = 1; i <= n; ++i)
		Read(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)
	{
		Read(x); 
		Read(y);
		minn = A[x];
		for (int j = x; j <= y; j++)
		{
			if ((j - 1) % length == 0 && j + 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;
}