Cod sursa(job #2484846)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 31 octombrie 2019 18:11:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <cstdio>

using namespace std;

int n, m;
int v[100005], r[17][100005], log[100005];

void gen_log() {
	int lb = 1;

	log[1] = 0;
	for(int i = 2; i <= n; i++)
		if(i == lb * 2) {
			log[i] = log[lb] + 1;
			lb *= 2;
		}
		else
			log[i] = log[lb];
}

void gen_r() {
	for(int i = 0; i <= log[n]; i++)
		for(int j = 1; j + (1 << i) - 1 <= n; j++)
			if(i == 0)
				r[i][j] = v[j];
			else
				r[i][j] = min(r[i - 1][j], r[i - 1][j + (1 << (i - 1))]);
}

int get_min(int a, int b) {
	int l = b - a + 1;

  return min(r[log[l]][a], r[log[l]][b - (1 << log[l]) + 1]);
}

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	int x, y;

	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%d", &v[i]);

	gen_log();
	gen_r();

	for(int i = 1; i <= m; i++) {
		scanf("%d %d", &x, &y);
    printf("%d\n", get_min(x, y));
	}

	return 0;
}