Cod sursa(job #1455081)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 27 iunie 2015 13:16:32
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
#define MAX 100005
#define min(x,y) (((x) < (y)) ? (x) :(y))

void constrRMQ(int rmq[][MAX], int n, int log);
int query(int rmq[][MAX], int log[], int x, int y);

int main(){
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	int n, m, i, x, y, rmq[18][MAX], log[MAX];
	scanf("%d%d", &n, &m);
	log[1] = 0;
	for(i = 1; i <= n; i++){
		scanf("%d", &rmq[0][i]);
		log[i + 1] = log[(i + 1) / 2] + 1;
	}
	
	constrRMQ(rmq, n, log[n]);
	for(i = 0; i < m; i++){
		scanf("%d%d", &x, &y);
		printf("%d\n", query(rmq, log, x, y));
	}
	return 0;
}

void constrRMQ(int rmq[][MAX], int n, int log){
	int i, j;
	for(i = 1; i <= log; i++)
		for(j = 1; j <= n - (1<<i) + 1; j++)
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1<<(i - 1))]);
}

int query(int rmq[][MAX], int log[], int x, int y){
	int d = log[y - x + 1];
	return min(rmq[d][x], rmq[d][y - (1<<d) + 1]);
}