Cod sursa(job #2230599)

Utilizator TrixerAdrian Dinu Trixer Data 10 august 2018 18:33:07
Problema Range minimum query Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <math.h>

#define NMAX 		100001
#define LOG2NMAX 	17

int n, m;
int A[NMAX];
int M[NMAX][LOG2NMAX];

int query(int a, int b)
{
	int k = log2(b - a + 1);
	int x = M[a][k];
	int y = M[b - (1 << k) + 1][k];
	return (A[x] <= A[y]) ? x : y;
}

int main()
{
	// read input
	freopen("rmq.in", "r", stdin);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &A[i]);

	// precompute index table
	for (int i = 1; i <= n; i++)
		M[i][0] = i;

	for (int j = 1; (1 << j) <= n; j++)
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			int x = M[i][j - 1];
			int y = M[i + (1 << (j - 1))][j - 1];
			M[i][j] = (A[x] < A[y]) ? x : y; 
		}

	// do queries
	freopen("rmq.out", "w", stdout);
	for (int k = 0; k < m; k++) {
		int a, b;
		scanf("%d%d", &a, &b);
		printf("%d\n", A[query(a, b)]);
	}

	return 0;
}