Cod sursa(job #2916427)

Utilizator MarcGrecMarc Grec MarcGrec Data 29 iulie 2022 17:45:53
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#define MAX_N 100000
#define BUCKET_SIZE 317
#define GET_BUCKET(index) (((index) / BUCKET_SIZE) + (((index) % BUCKET_SIZE) != 0))
#define GET_BUCKET_LEFT(index) (((GET_BUCKET(index) - 1) * BUCKET_SIZE) + 1)
#define GET_BUCKET_RIGHT(index) min(n, (GET_BUCKET(index) * BUCKET_SIZE))

#include <fstream>
#include <algorithm>
using namespace std;

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

int n, m, a[MAX_N + 1], b[GET_BUCKET(MAX_N) + 1];

int main()
{
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
		fin >> a[i];
	for (int i = 1; i <= n; ++i)
		if (i == GET_BUCKET_LEFT(i))
			b[GET_BUCKET(i)] = a[i];
		else
			b[GET_BUCKET(i)] = min(b[GET_BUCKET(i)], a[i]);
	for (int i = 1; i <= m; ++i)
	{
		int x, y, z;
		fin >> x >> y;
		z = a[x];
		if (GET_BUCKET(x) == GET_BUCKET(y))
			for (int i = x + 1; i <= y; ++i)
				z = min(z, a[i]);
		else
		{
			for (int i = x + 1; i <= GET_BUCKET_RIGHT(x); ++i)
				z = min(z, a[i]);
			for (int i = GET_BUCKET(x) + 1; i < GET_BUCKET(y); ++i)
				z = min(z, b[i]);
			for (int i = GET_BUCKET_LEFT(y); i <= y; ++i)
				z = min(z, a[i]);
		}
		fout << z << '\n';
	}
    fin.close();
    fout.close();
    return 0;
}