Cod sursa(job #613983)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 5 octombrie 2011 11:56:37
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb

#include <cstdio>
#include <fstream>
#include <algorithm>

using namespace std;

#define N 100001

int rmq[N][32],lg[N],n,q;

ifstream in ("rmq.in");

void read ()
{
	
	in>>n>>q;
	for(int i=1;i<=n;++i)
		in>>rmq[i][0];
	
	}
	
void dinam ()
{
	
	for(int i=2;i<=n;++i)
		lg[i]=lg[i>>1]+1;
	for(int j=1;(1<<j)<=n;++j)
		for(int i=1;i<=n;++i){
			rmq[i][j]=rmq[i][j-1];
			if(i+(1<<(j-1))<=n)
				rmq[i][j]=min(rmq[i][j],rmq[i+(1<<(j-1))][j-1]);
			}
	
}

void solve ()
{

	freopen ("rmq.out","w",stdout);
	for(int x,y,k;q;--q){
		in>>x>>y;
		if(x==y)
			printf("%d\n",rmq[x][0]);
		else{
		k=lg[y-x];
		printf("%d\n",min(rmq[x][k],rmq[y-(1<<k)+1][k]));
		}
	}
	
	}

int main ()
{
	
	read();
	dinam();
	solve();
	
	return 0;}