Cod sursa(job #614000)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 5 octombrie 2011 13:03:16
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include <cstdio>
#include <fstream>

using namespace std;

#define N 100001

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

int main ()
{
	
	int n,q,i,j,a,b;
	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{
			a=rmq[lg[j-i]][i];
			b=rmq[lg[j-i]][j-(1<<lg[j-i])+1];
			if(a<b)
				printf("%d\n",a);
			else
				printf("%d\n",b);
		}
	}
	
	return 0;}