Cod sursa(job #1224112)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 29 august 2014 18:59:27
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <vector>

using namespace std;

int n, m, x;
vector<int> nrs;
int M[100001][17];

void init(){
	for(int i = 0; i < 100000; i++){	// todo!
		for(int j = 0; j < 17; j++)
			M[i][j] = 100001;
	}

	for (int i = 0; i < n; i++)
          M[i][0] = i;
	for(int j = 1; (1 << j) <= n; j++){
		for (int i = 0; i + (1 << j) - 1 < n; i++)
              if (nrs[M[i][j - 1]] <= nrs[M[i + (1 << (j - 1))][j - 1]])
                  M[i][j] = M[i][j - 1];
              else
                  M[i][j] = M[i + (1 << (j - 1))][j - 1];
	}
}

int lg2(int x){
	int cnt = 0;
	while(1 << cnt <= x){
		cnt++;
	}
	return cnt-1;
}

int rmq(int b, int e){
	int min_pow = lg2(e-b+1);
	if(nrs[M[b][min_pow]] < nrs[M[e-(1 << min_pow)+1][min_pow]]){
		return M[b][min_pow]; 
	}
	return M[e-(1 << min_pow)+1][min_pow];
}

int main(){
	int b, e;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	//cin >> n >> m;
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++){
		//cin >> x;
		scanf("%d", &x);
		nrs.push_back(x);
	}
	init();
	for(int i = 0; i < m; i++){
		scanf("%d%d", &b, &e);
		//cin >> b >> e;
		printf("%d\n", nrs[rmq(b-1, e-1)]);
	}

	return 0;
}