Cod sursa(job #613995)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 5 octombrie 2011 12:34:03
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <cstdio>
#include <fstream>
#include <algorithm>

using namespace std;

#define N 100001

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

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