Cod sursa(job #170559)

Utilizator anoukAnca Dumitrache anouk Data 2 aprilie 2008 21:47:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <iostream>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define DIM 100002
using namespace std;

long int N, M, A[DIM], x, y, log[DIM], rmq[19][DIM], a, b;

int main()
{
	FILE *fin = fopen("rmq.in", "r");
	FILE *fout = fopen("rmq.out", "w");

	fscanf(fin, "%ld%ld", &N, &M);
	for (int i = 1; i <= N; i++)
		fscanf(fin, "%ld", A+i);

	for (int i = 2; i <= N; i++)
		log[i] = log[i / 2] + 1;
	for (int i = 1; i <= N; i++)
		rmq[0][i] = A[i];
	for (int i = 1; (1 << i) <= N; i++)
		for (int j = 1; j <= N - (1 << i) + 1; j++)
		{
			a  = 1 << (i - 1);
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + a]);
		}
	//cout << M; cin.get();
	for (int i = 1; i <= M; i++)
	{
		fscanf(fin, "%ld%ld", &x, &y);
		b = log[y - x + 1];
		a = y - x + 1 - (1 << b);
		//cout << a << " " << b << "\n";
		fprintf(fout, "%ld\n", min(rmq[b][x], rmq[b][x + a]));
	}

	fclose(fin);
	fclose(fout);
	return 0;
}