Cod sursa(job #1786742)

Utilizator RobertSSamoilescu Robert RobertS Data 23 octombrie 2016 15:57:58
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

int const MAX_ROWS = 100001;
int const MAX_COLS = 20;


int N, M, v[MAX_ROWS], rmq[MAX_ROWS][MAX_COLS];

void build_rmq() {
	

	int cols = floor(log2(N)) + 1, rows = N;

	for (int i = 0; i < rows; i++) {
		rmq[i][0] = i;
	}

	

	for (int j = 1; j < cols; j++) {
		for (int i = 0; i + (1 << j) - 1 < rows; i++) {
			int step = 1 << (j - 1);
			int index1 = rmq[i][j - 1], index2 = rmq[i + step][j - 1];
			
			if (v[index1] < v[index2])
				rmq[i][j] = index1;
			else
				rmq[i][j] = index2;
		}
	}

}

int query(int x, int y) {

	int li = min(x, y), ls = max(x, y);

	int len = ls - li + 1;
	int step = floor(log2(len));
	int rem = len - (1 << step);
	
	return min(v[rmq[li][step]], v[rmq[li + rem][step]]);

}


int main() {

	ifstream fin("rmq.in");
	ofstream fout("rmq.out");

	fin >> N >> M;

	for (int i = 0; i < N; i++) {
		fin >> v[i];		
	}


	build_rmq();

	int index1, index2;
	for (int i = 0; i < M; i++) {
		fin >> index1 >> index2;
		fout << query(index1 - 1, index2 - 1) << '\n';
	}



	fin.close();
	fout.close();

	return 0;
}