Cod sursa(job #2767171)

Utilizator Darius_CDarius Chitu Darius_C Data 5 august 2021 03:58:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
// Range minimum query.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <fstream>
#define NMAX 100060
#define MAXLOGN 18
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
using namespace std;

int N, M;
int A[NMAX], RMQ[NMAX][MAXLOGN];
int lg2[NMAX];

static inline void Read()
{
	fin >> N >> M;
	for (int i = 0; i < N; i++)
		fin >> A[i];

	lg2[1] = 0, lg2[2] = 1;
	for (int i = 3; i <= N; i++)
		lg2[i] = lg2[i / 2] + 1;
}

static inline void RangeMinimumQuery()
{
	for (int i = 0; i < N; i++)
		RMQ[i][0] = i;
	for (int j = 1; 1 << j <= N; j++)
		for (int i = 0; i + (1 << j) - 1 < N; i++)
			if (A[RMQ[i][j - 1]] < A[RMQ[i + (1 << (j - 1))][j - 1]])
				RMQ[i][j] = RMQ[i][j - 1];
			else
				RMQ[i][j] = RMQ[i + (1 << (j - 1))][j - 1];
}

static inline void Solve()
{
	for (int x, y; M; M--)
	{
		fin >> x >> y;
		x--, y--;
		int ans;
		int k = lg2[y - x + 1];
		if (A[RMQ[x][k]] < A[RMQ[y - (1 << k) + 1][k]])
			ans = A[RMQ[x][k]];
		else
			ans = A[RMQ[y - (1 << k) + 1][k]];
		fout << ans << "\n";
	}
}

int main()
{
	Read();
	RangeMinimumQuery();
	Solve();
	return 0;
}