Cod sursa(job #1066877)

Utilizator cosmo0093Raduta Cosmin cosmo0093 Data 25 decembrie 2013 18:58:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <algorithm>

class RMQ {
	int nV;
	int *myL;
	int **myM;

public:
	
	RMQ(int *Arr, int x) : nV(x), myL(new int[nV + 1]) {
		myL[1] = 0;
		for(int i = 2; i <= nV; i++) {
			myL[i] = myL[i >> 1] + 1;
		}
		myM = new int*[nV + 1];
		for(int i = 0; i <= nV; i++) {
			myM[i] = new int[myL[nV] + 1];
		}
		for(int i = 0; i <= nV; i++) {
			for(int j = 0; j <= myL[nV]; j++) {
				myM[i][j] = 0;
			}
		}
		for(int i = 1; i <= nV; i++) {
			myM[i][0] = Arr[i];
		}
		for(int j = 1; (1 << j) <= nV; j++) {
			for(int i = 1; i + (1 << j) - 1 <= nV; i++) {
				myM[i][j] = std::min(myM[i][j - 1], myM[i + (1 << (j - 1))][j - 1]);
			}
		}
	}

	int query(int a, int b) {
		int aux = b - a + 1;
		int search = aux - (1 << myL[aux]);
		return std::min(myM[a][myL[aux]], myM[a + search][myL[aux]]);
	}

	~RMQ() {
		delete[] myL;
		for(int i = 0; i <= nV; i++) {
			delete[] myM[i];
		}
		delete[] myM;
	}
};

int main() {
	std::ifstream in("rmq.in");
	std::ofstream out("rmq.out");
	int *Arr, nV, nOp;
	in >> nV >> nOp;
	Arr = new int[nV + 1];
	for(int i = 1; i <= nV; i++) {
		in >> Arr[i];
	}
	RMQ a(Arr, nV);
	int x, y;
	for(int i = 0; i < nOp; i++) {
		in >> x >> y;
		out << a.query(x, y) << '\n';
	}
	delete[] Arr;
	return 0;
}