Cod sursa(job #1016781)

Utilizator ELHoriaHoria Cretescu ELHoria Data 26 octombrie 2013 18:59:52
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <cstdio>
#include <vector>
#include <cstring>


using namespace std;

const int nmax = int(1e5) + 2;
int rmq[18][nmax];
int lg[nmax];
int n, m;

inline int query(const int &a,const int &b) {
	int l = lg[b - a + 1];
	return min(rmq[l][a],rmq[l][b - (1<<l) + 1]);
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d %d",&n,&m);	
	for(int i = 1;i <= n;i++) {
		scanf("%d",&rmq[0][i]);
		lg[i + 1] = lg[(i + 1)>>1] + 1;
	}

	for(int i = 1;(1<<i) <= n;i++) {
		for(int j = 1;j <= n - (1<<i) + 1;j++) {
			rmq[i][j] = min(rmq[i - 1][j],rmq[i - 1][j + (1<<(i - 1))]);
		}
	}

	int a, b;
	for(int i = 1;i <= m;i++) {
		scanf("%d %d",&a,&b);
		printf("%d\n",query(a,b));
	}
	
	return 0;
}