Cod sursa(job #633408)

Utilizator eduEduard Gabriel Bazavan edu Data 13 noiembrie 2011 18:56:47
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define MAXN 100000

#define INF 100000;

int N, M;
int A[MAXN];

void solve_simple(int *A, int N, int M) {
	int x, y;
	
	long S[1000];
	long ind[1000];
	memset(S, 100000, 1000*sizeof( long));
	memset(ind, 0, 1000*sizeof( long));
	
	int d = floor(sqrt(N));
	int splits;
	for (int s = 0, i = 0; s < N-d; s += d, i++) {
		ind[i] = s;
		ind[i+1]=N;
		splits = i+1;
	}
	
	for (int i = 0; i < splits; i++) {
		S[i] = INF;
		for (int j = ind[i]; j < ind[i+1]; j++) {
			if (S[i] > A[j]) {
				S[i] = A[j];
			}
		}
	}
	S[splits] = INF;
	
	for (int t=0; t<M; t++) {
		scanf("%d %d\n", &x, &y);
		x--,y--;
		int start, stop;
		for (int i = 0; i < splits; i++) {
			if (ind[i] > x) {
				start = i;
				break;
			}
		}
		for (int i = splits-1; i >= 0; i--) {
			if (y > ind[i]) {
				stop = i-1;
				break;
			}
		}
		
		int min = INF;
		if (stop <= start) {
			for (int i = x; i <= y; i++) {
				if (A[i] < min) {
					min = A[i];
				}
			}
		} else {
			for (int i = start; i <= stop; i++) {
				if (S[i] < min) {
					min = S[i];
				}
			}
			for (int i = x; i < ind[start+1]; i++) {
				if (A[i] < min) {
					min = A[i];
				}
			}
			for (int i = ind[stop-1]; i <= y; i++) {
				if (A[i] < min) {
					min = A[i];
				}
			}
		}
		printf("%d\n", min);
	}
}

int main() {
	
	freopen("rmq.in", "rt", stdin);
	freopen("rmq.out", "wt", stdout);
	
	scanf("%d %d\n", &N, &M);
	for (int i = 0; i < N; i++) {
		scanf("%d\n", &A[i]); 
	}
	
	solve_simple(&A[0], N, M);
	return 0;
}