Cod sursa(job #1442782)

Utilizator MciprianMMciprianM MciprianM Data 26 mai 2015 12:10:16
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <cstring>
#include <deque>

using namespace std;

static const int MAXN = 100009;
static const int INF = 0x3F3F3F3F;
static const int MAXR = 300;
int n, m;
int v[MAXN];
int mr[MAXN];

int main()
{
	int x, y;
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	f >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		f >> v[i];
	}
	memset(mr, 0x3F, sizeof(mr));
	deque<int> q;
	for(int i = 1; i < MAXR && i <= n; i++)
	{
		while(!q.empty() && v[q.back()] > v[i])
		{
			q.pop_back();
		}
		q.push_back(i);
	}
	for(int i = MAXR; i <= n; i++)
	{
		while(!q.empty() && v[q.back()] > v[i])
		{
			q.pop_back();
		}
		q.push_back(i);
		if(q.front() < i - MAXR + 1)
		{
			q.pop_front();
		}
		mr[i - MAXR + 1] = v[q.front()];
	}
	for(int i = 0; i < m; i++)
	{
		f >> x >> y;
		int ans = INF;
		int j;
		for(j = x; j + MAXR - 1 <= y; j+= MAXR)
		{
			ans = min(ans, mr[j]);
		}
		for(; j <= y; j++)
		{
			ans = min(ans, v[j]);
		}
		g << ans << '\n';
	}
	f.close();
	g.close();
	return 0;
}