Cod sursa(job #154543)

Utilizator floringh06Florin Ghesu floringh06 Data 11 martie 2008 11:54:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>

#define FIN "rmq.in"
#define FOUT "rmq.out"
#define MAX_N 100000
#define MAX_L 18

int A[MAX_L][MAX_N];

int N, M;

	inline int MIN (int a, int b)
	{
	     if (a < b) return a; else return b;
	}

	void rmq ()
	{
	    int i, j;

	    for (i = 1; 1 << i <= N; ++i)
		for (j = 1; j <= N - (1 << i) + 1; ++j)
		   A[i][j] = MIN (A[i - 1][j], A[i - 1][j + (1 << (i - 1))]);
	}


	int main ()
	{
	    freopen (FIN, "r", stdin);
	    freopen (FOUT, "w", stdout);

	    scanf ("%d %d", &N, &M);
	    int i;
	    for (i = 1; i <= N; ++i)
		scanf ("%d", A[0] + i);

	    rmq();

	    int x, y;
	    for (i = 1; i <= M; ++i)
	    {
		scanf("%d %d", &x, &y);
		int L = y - x + 1;
		int k = 1;
		int kc = 0;
		for (; k << 1 <= L; k <<= 1, ++kc);
		printf ("%d\n", MIN (A[kc][x], A[kc][y - k + 1]));
	    }

	    return 0;
	}