Cod sursa(job #360324)

Utilizator serbanlupulupulescu serban serbanlupu Data 30 octombrie 2009 22:20:52
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int v[100001];
int nr_v;
int H[100001];

inline void update(int node, int left, int right, int poz, int val)
{
	if (left >= right)
	{
		H[node]=val;
		return;
	}
	
	int middle=(left+right)>>1;
	
	if (poz <=middle)
		update(2*node, left, middle, poz, val);
	else
		update(2*node+1, middle+1, right, poz, val);
	H[node]=min(H[2*node], H[2*node+1]);
};

inline int query(int node, int left, int right, int i, int j)
{
	if (i<=left && right<=j)
		return H[node];
	
	int minim=200000;
	int middle=(left+right)>>1;
	
	if (i <= middle)
		minim=min(minim, query(2*node, left, middle, i, j));
	if (middle < j)
		minim=min(minim, query(2*node+1, middle+1, right, i, j));
	
	return minim;
}

void solve(const char *buff_file, const char *out_file)
{
	fstream f(buff_file, ios::in);
	f>>nr_v;
	int m;
	f>>m;
	
	for (int i=1; i<=nr_v; ++i)
	{
		f>>v[i];
		update(1, 1, nr_v, i, v[i]);
	}
	
	int left, right;
	fstream g(out_file, ios::out);
	for (int i=1; i<=m; ++i)
	{
		f>>left>>right;
		g<<query(1, 1, nr_v, left, right)<<"\n";
	}
	f.close();
	g.close();
}

int main()
{
	solve("rmq.in", "rmq.out");
	return 0;
}