Cod sursa(job #613988)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 5 octombrie 2011 12:19:02
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.62 kb
#include <cstdio>
#include <fstream>
#include <algorithm>

using namespace std;

#define N 100001

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

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