Cod sursa(job #879187)

Utilizator howsiweiHow Si Wei howsiwei Data 15 februarie 2013 07:19:19
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	ifstream fin("rmq.in");
	ofstream fout("rmq.out");
	int n, nquery;
	fin >> n >> nquery;
	vector<int> a(n);
	for (int i=0; i<n; ++i) fin >> a[i];
	vector<vector<int> > rmq;
	rmq.push_back(a);
	for (int step=1; 1<<step<n; ++step) {
		rmq.push_back(vector<int>(n));
		for (int i=0; i<n; ++i) {
			int temp=(i+(1<<(step-1)))<n ?rmq[step-1][i+(1<<(step-1))] :1<<30;
			rmq[step][i]=min( rmq[step-1][i], temp );
		}
	}
	for (int i=0,low,up; i<nquery; ++i) {
		fin >> low >> up;
		--low;
		int step=0, range=up-low;
		while ((1<<step)<range) ++step;
		--step;
		fout << min(rmq[step][low], rmq[step][up-(1<<step)]) << '\n';
	}
	return 0;
}