Cod sursa(job #1368306)

Utilizator ooptNemes Alin oopt Data 2 martie 2015 16:06:01
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
// rmq
#include <iostream>
#include <fstream>
#include <algorithm>

#define NMax 100005
#define inf (1<<30)+100

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n,q;
int arbmin[8*NMax];
int val, poz;
int st, dr; // Fixed
int sol;

void query(int node, int left, int right) {
	if (st <= left && right <= dr) {
		sol = min(sol, arbmin[node]);
		return;
	}

	int mid = (left+right)/2;
	if (mid >= st)
		query(2*node, left, mid);
	if (mid < dr)
		query(2*node+1, mid+1, right);
}

void update(int node, int left, int right) {
	if (left == right) {
		arbmin[node] = val;
		return;
	}

	int mid = (left+right)/2;
	if (poz >= left && poz <= mid)
		update(2*node, left, mid);
	if (poz > mid && poz <= right)
		update(2*node+1, mid+1, right);
	arbmin[node] = min(arbmin[2*node], arbmin[2*node+1]);
}

void read() {
	f>>n>>q;
	for (int i=1;i<=n;i++) {
		f>>val;
		poz = i;
		update(1,1,n);
	}

	for (int i=1;i<=q;i++) {
		f>>st>>dr;
		sol = inf;
		query(1,1,n);
		g<<sol<<'\n';
	}
}

int main() {

	read();

	f.close(); g.close();
	return 0;
}