Cod sursa(job #3140478)

Utilizator lensuLensu Alexandru lensu Data 6 iulie 2023 20:22:40
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

const int NMAX = 100000,LOGMAX = 17;

int N, v[NMAX], LOG[NMAX+1], mini[NMAX][LOGMAX], Q;


void citire()
{
	cin >> N >> Q;
	for (int i = 1; i <= N; i++)
	{
		cin >> v[i];
	}
}

void precalcLOG()
{
	LOG[1] = 0;
	for (int i = 2; i <= NMAX; i++)
	{
		LOG[i] = LOG[i / 2] + 1;
	}
}

void rmq()
{
	//minimul pt un interval de lungime din i 2^0 este numarul in sine
	for (int i = 1; i <= N; i++)
	{
		mini[i][0] = v[i];
	}
	//minimul pt un interval de lungime 2^k din i este minimul dintre minimul unui interval de lungime 2^(k-1) din i si minimul unui interval de lungime 2^(k-1) din i + 2^k - 1
	for (int k = 1; k < LOGMAX; k++)
	{
		for (int i = 1; i + (1 << k) - 1 <= N; i++)
		{
			mini[i][k] = min(mini[i][k - 1], mini[i + (1 << k) - 1][k - 1]);
		}
	}
}

void queries()
{
	for (int i = 1; i <= Q; i++)
	{
		int st, dr;
		cin >> st >> dr;
		int l = dr - st + 1;
		int rez = min(mini[st][LOG[l]], mini[dr - (1 << LOG[l]) + 1][LOG[l]]);
		cout << rez << '\n';
	}
}

int main()
{
	citire();
	precalcLOG();
	rmq();
	queries();
	return 0;
}