Cod sursa(job #1784763)

Utilizator RadduFMI Dinu Radu Raddu Data 20 octombrie 2016 14:46:03
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#define INF (1LL<<30)
#define DIM 100000
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m, k, pos=0, len, dx[1005], dy[1005], mn[1005], v[100005], buc[100005];
char sir[DIM];

void Read(int &x)
{ 
	while (!isdigit(sir[pos]))
	 if (++pos == DIM) f.read(sir, DIM),pos=0;
	    	  
	x = 0;
	while (isdigit(sir[pos]))
	{
		x = x * 10 + sir[pos] - 48;
		if (++pos == DIM) f.read(sir, DIM), pos = 0;
	}
}

void Seq()
{
	int i, temp, beg, end;
	beg = 1;

	while (beg <= n)
	{
		end = beg + len - 1;

		if (end > n) end = n;

		k++;  dx[k] = beg; dy[k] = end;

		temp = INF;
	
		for (i = beg; i <= end; i++)
		{
			
			temp = min(temp, v[i]);
			buc[i] = k;
		}

		mn[k] = temp;

	
		beg += len;
	}
}

int Search(int i1, int i2)
{
	int i, ans = INF , actx=buc[i1], acty=buc[i2];
	if (actx != acty)
	{
		for (i = i1; i <= dy[actx]; i++)
			ans = min(ans, v[i]);

		for (i = dx[acty]; i <= i2; i++)
			ans = min(ans, v[i]);
	}
	else
		for (i = i1; i <= i2; i++)
			ans = min(ans, v[i]);

	for (i = actx + 1; i < acty; i++)
		ans = min(ans, mn[i]);

	return ans;
}

int main()
{
	int i, x, y;
	Read(n); Read(m);
	len = (int)sqrt(n);

	for (i = 1; i <= n; i++)
		Read(v[i]);

	Seq();
	

	for (i = 1; i <= m; i++)
	{
		Read(x); Read(y);
		g << Search(x, y)<<"\n";
	}



	return 0;
}