Cod sursa(job #675865)

Utilizator informatician28Andrei Dinu informatician28 Data 8 februarie 2012 13:16:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define DIM 100001


using namespace std; 
ifstream in("rmq.in");
ofstream out("rmq.out");

int N, M, minim, Arb[DIM*3];

void Update(int nod, int st, int dr, int pos, int val)
{
	if( st == dr )
		Arb[nod] = val;
	else
	{
		long long mid = (st + dr)/2;
		if( pos <= mid )        Update(2*nod, st, mid, pos, val);
		else                    Update(2*nod+1, mid+1, dr, pos, val);
	
	Arb[nod] = min(Arb[2*nod], Arb[2*nod+1]);
	}
}
void Query(int nod, int st, int dr, int a, int b)
{
	if( a <= st && b >= dr )
		minim = min(minim, Arb[nod]);
	else
	{
		long long mid = (st+dr)/2;
		if( a <= mid )   Query(2*nod,st,mid,a,b);
		if( b > mid )    Query(2*nod+1,mid+1,dr,a,b);
	}
}
int main()
{
	int i, nr, x, y;
	
	in >> N >> M;
	for(i = 1; i <= N; i++)
	{
		in >> nr;
		Update(1,1,N,i,nr);
	}
	for(i = 1; i <= M; i++)
	{
		in >> x >> y;
		minim = INF;
		Query(1,1,N,x,y);
		out << minim << '\n';
	}
	
	return 0;
}