Cod sursa(job #2900611)

Utilizator stefanliciuLiciu Vasile-Stefan stefanliciu Data 11 mai 2022 15:37:23
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100001;
const int K = 16; //>= log2(100000);
int d[NMAX + 1][K + 1];

int main()
{
	int N, M, x, y;
	int* v;

	fin >> N >> M;
	v = new int[N + 1];

	for (int i = 0; i < N; ++i)
	{
		fin >> v[i];
		d[i][0] = v[i];
	}
	
	for (int j = 1; j < K; ++j)
		for (int i = 0; i + (1 << j) <= N; ++i)
		{
			if (j != 0 && i + 1 << (j - 1) < N)
			{
				int p = 1 << (j - 1);
				if (d[i][j - 1] < d[i + p][j - 1])
				{
					d[i][j] = d[i][j - 1];
				}
				else d[i][j] = d[i + p][j - 1];
			}
		}
	for (int i = 0; i < M; ++i)
	{
		fin >> x >> y;
		int dim = y - x + 1;
		int l = (int)log2(dim);
		if (log2(dim) == l)
		{
			fout << min(d[x - 1][l], d[y - 1][0])<<'\n';
		}
		else
		{
			
			fout << min(d[x - 1][l], d[y - 1 - (1 << l) + 1][l])<<'\n';
		}
	}
	
	return 0;

}