Cod sursa(job #2647831)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 6 septembrie 2020 16:47:21
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>

using namespace std;

int min(int x, int y) {
	return x<=y? x:y;
}


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

	int n, m, y, x, logn, r, l;
	scanf("%d%d", &n, &m);

	int logs[n+1];
	logs[0] = logs[1] = 0;
	for(int i=2; i<=n; ++i)
		logs[i] = logs[i/2] + 1;

	int arb[logs[n] + 3][n+2];

	for(int i=1; (1<<i) <= n; ++i)
		for(int j=1; j<=n - (1<<i) + 1; ++j)
			arb[i][j] = 0;

	for(int i=1; i<=n; ++i) {
		scanf("%d", &x);
		arb[0][i] = x;
	}

	for(int i=1; (1<<i) <= n; ++i)
		for(int j=1; j<=n - (1<<i) + 1; ++j) {
            l = 1 << (i-1);
			arb[i][j] = min(arb[i-1][j], arb[i-1][j+l]);
		}

	for(int i=0; i<m ;++i) {
		scanf("%d%d", &x, &y);
		l = logs[y-x + 1];
		r = y - x + 1 - (1<<l);
		printf("%d\n", min(arb[l][x], arb[l][x+r]));

	}

	return 0;
}