Cod sursa(job #1087288)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 19 ianuarie 2014 10:45:57
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int n,m,pos,val,start,finish,minim;
int ARBINT[4*MAXN];
void update(int node, int left, int right)
{
	if (left==right)
	{
		ARBINT[node]=val;
		return;
	}
	int mid=(left+right)>>1;
	if (pos<=mid)	update(node*2,left,mid);
	else			update(node*2+1,mid+1,right);

	ARBINT[node]=min(ARBINT[node*2],ARBINT[node*2+1]);
}
void query(int node, int left, int right)
{
	if (start<=left && finish>=right)
	{
		if (ARBINT[node]<minim)
			minim=ARBINT[node];
		return;
	}
	int mid=(left+right)>>1;
	if (start<=mid)	query(node*2,left,mid);
	if (finish>mid)	query(node*2+1,mid+1,right);
}
int main()
{
	int i,x,y;
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1; i<=n; ++i)
	{
		scanf("%d",&x);
		pos=i;	val=x;
		update(1,1,n);
	}
	for (i=1; i<=m; ++i)
	{
		scanf("%d%d",&x,&y);
		start=x;	finish=y;
		minim=1<<30;
		query(1,1,n);
		printf("%d\n",minim);
	}

	return 0;
}