Cod sursa(job #812111)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 noiembrie 2012 15:14:05
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.67 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;

ifstream fi ("rmq.in");
ofstream fo ("rmq.out");

const int dimn = 100002;
int N, M, B[17][dimn], P[dimn];

void cit ()
{
	int i, b, p;
	fi >> N >> M;
	for (i = 1; i <= N; i++)
	{
		fi >> B[0][i];
		if (i > 1)
			P[i] = P[i>>1] + 1;
	}
	for (b = 1; (1<<b) <= N; b++)
	{
		p = 1 << b;
		for (i = 1; i <= N - p + 1; i++)
		{
			B[b][i] = min (B[b-1][i], B[b-1][i+(p>>1)]);
		}
	}	
}

int main ()
{
	int a, b, d;
	cit ();
	while (M--)
	{
		fi >> a >> b;
		d = b - a + 1;		
		fo << min (B[P[d]][a], B[P[d]][b-(1<<P[d])+1]) << '\n';
	}
	return 0;
}