Cod sursa(job #343563)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 26 august 2009 13:17:19
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#define MaxN 100001
using namespace std;
fstream fin ("rmq.in", ios::in);
fstream fout("rmq.out", ios::out);

int v[350000];
int n, m, x, y, best;

void updat(int poz, int val){
	int elem = 1;
	int st = 1, dr = n;
	int mid;
	while (1){
		if (v[elem] == 0 || v[elem] > val) v[elem] = val;
		mid = (st + dr) >> 1;
		if (poz <= mid) {
			elem = elem << 1;
			dr = mid;
		} else {
			elem = 1 + (elem << 1);
			st = mid + 1;
		};
		if (st == dr) {
			v[elem] = val;
			return;
		};
	};
};


void search_it(int elem, int st, int dr){
	if (st >= x && dr <= y) best = min(best, v[elem]);
	else {
		int mid = (st + dr) >> 1;
		if (x <= mid) search_it(elem << 1, st, mid);
		if (y > mid) search_it( 1 + (elem << 1),  mid + 1, dr);
	};
};

int main(){
	fin>>n>>m;
	for (int i = 1; i <= n; ++i){
		fin>>x;
		updat(i, x);
	};
	for (int i = 1; i <= m; ++i){
		fin>>x>>y;
		best = 100001;
		search_it(1, 1, n);
		fout<<best<<'\n';
	};

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


};