Cod sursa(job #879330)

Utilizator howsiweiHow Si Wei howsiwei Data 15 februarie 2013 11:36:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <iostream>
#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; i<int(rmq.size()); ++i) {
		//for (int j=0; j<n; ++j) {
			//fout << rmq[i][j] << ' ';
		//}
		//fout << '\n';
	//}
	//return 0;
	for (int i=0,low,up; i<nquery; ++i) {
		fin >> low >> up;
		//cout << low << ' ' << up << '\n';
		--low;
		int step=0, range=up-low;
		while ((1<<step)<=range) ++step;
		--step;
		fout << min(rmq[step][low], rmq[step][up-(1<<step)]) << '\n';
		//cout << step;
		//cin.get();
	}
	return 0;
}