Cod sursa(job #2909194)

Utilizator NFJJuniorIancu Ivasciuc NFJJunior Data 9 iunie 2022 20:01:51
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <bits/stdc++.h>
using namespace std;
const int Max = 1e5;
ifstream f("rmq.in");
ofstream g("rmq.out");
#define cin f
#define cout g

int n, m, log2n, arr[Max], rmq[Max][20];

int main()
{
	cin >> n >> m;
	log2n = floor(log(n) / log(2));
	for(int i = 0; i < n; i ++)
		cin >> arr[i];
	for(int i = 0; i < n; i ++)
		rmq[i][0] = i;
	for(int j = 1, size = 2; size <= n; j ++, size <<= 1)
	{
		for(int i = 0; i + size - 1 < n; i ++)
			if(arr[rmq[i][j - 1]] <= arr[rmq[i + size / 2][j - 1]])
				rmq[i][j] = rmq[i][j - 1];
			else
				rmq[i][j] = rmq[i + size / 2][j - 1];
	}
	while(m --)
	{
		int i, j;
		cin >> i >> j;
		i --, j --;
		int k = floor(log(j - i + 1) / log(2));
		cout<<min(arr[rmq[i][k]], arr[rmq[j - (1 << k) + 1][k]])<<'\n';
	}
	return 0;
}