Cod sursa(job #565668)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 28 martie 2011 09:23:45
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<fstream>
#include<algorithm>
#define NMAX 100005

using namespace std;

int a[17][NMAX], n, m, b[NMAX], c[NMAX];

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

void Citeste()
{
	int i, p, k=0;
	f>>n>>m;
	p=1;
	for (i=1; i<=n; ++i) 
	{
		f>>a[0][i];
		if (p*2>i) b[i]=p;
		else c[i]=(++k), b[i]=p*2, p*=2;
	}
}

void Preprop()
{
	int p=2, k=1,i;
	a[0][0]=2000000000;
	while (p<=n)
	{
		for (i=p; i<=n; i++) 
			a[k][i]=min(a[k-1][i-(p/2)], a[k-1][i]);
		p*=2; ++k;
	}
}

void Solve()
{
	int s, d, x;
	while (m--)
	{
		f>>s>>d;
		x=d-s+1;
		g<<min(a[c[b[x]]][s+b[x]-1], a[c[b[x]]][d])<<"\n";
	}
}

int main()
{
	Citeste();
	
	Preprop();
	
	Solve();
	
	f.close();
	g.close();
	return 0;
}