Cod sursa(job #303106)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 9 aprilie 2009 15:58:41
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>

using namespace std;

#define Nmax 101000 
#define FIN "rmq.in"
#define FOUT "rmq.out"
#define Nmin 21

int c[Nmin][Nmax];
int n,m;
int x,y;
int log[Nmax];


inline int min(int a, int b)
{
	if (a>b) return b;
	return a;
}

void citire()
{
	int i,j;
	
	freopen(FIN,"r",stdin);
	freopen(FOUT,"w",stdout);
	
	scanf("%d %d", &n,&m);
	for (i=1;i<=n;++i)
		 scanf("%d", &c[0][i]);
}

void solve()
{
	int i,j,l,s;
	log[0]=1;
	for (i=2;i<=n;++i)
		 log[i]=log[i/2]+1;
	
	
	for (s=1,l=1;l<=n;++s,l<<=1)
		 for (i=1;i<=n;++i)
			   c[s][i]=min(c[s-1][i],c[s-1][i+l]);
}

void scrie()
{
	int i,j;
	for (i=1;i<=m;++i)
	{
		scanf("%d %d", &x,&y);
		printf("%d\n", min(c[log[y-x+1]][x],c[log[y-x+1]][y-(1<<log[y-x+1])+1]));
	}
}

int main()
{
	citire();
	solve();
	scrie();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}