Cod sursa(job #578066)

Utilizator mihai995mihai995 mihai995 Data 10 aprilie 2011 22:33:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include <fstream>
using namespace std;

const int N=100002,M=18,inf=1<<30;
int v[N],a[N][M],n;

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

void RMQ()
{
	int i,j,k;
	for (i=0;i<N;i++)
		for (j=0;j<M;j++)
			a[i][j]=inf;
	for (i=n;i;i--)
	{
		a[i][0]=v[i];
		for (j=1,k=2;i+k<=n;j++,k<<=1)
			a[i][j]=min(a[i][j-1],a[i+k][j-1]);
	}
}

int query(int x,int y)
{
	if (!y)
		return inf;
	int p,q;
	for (p=0,q=1;q<=y;p++,q<<=1);
	q>>=1;p--;
	return min(a[x][p],query(x+q,y-q));
}

int main()
{
	int t,i,x,y;
	in>>n>>t;
	for (i=1;i<=n;i++)
		in>>v[i];
	RMQ();
	while (t--)
	{
		in>>x>>y;
		out<<query(x,y-x+1)<<"\n";
	}
	return 0;
}