Cod sursa(job #345378)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 2 septembrie 2009 19:32:03
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>
#define N 1<<18
int v[N],minim,inc,sf,poz,n,m,x;
inline int min(int a,int b)
{
	if (a<b)
		return a;
	return b;
}
void update(int nod,int st,int dr)
{
	if (st==dr)
	{
		v[nod]=x;
		return;
	}
	int t=(st+dr)/2;
	if (poz<=t)
		update(nod*2,st,t);
	else
		update(nod*2+1,t+1,dr);
	v[nod]=min(v[nod*2],v[nod*2+1]);
}
void query(int nod,int st,int dr)
{
	if (inc<=st && dr<=sf)
	{
		if (minim>v[nod])
			minim=v[nod];
		return;
	}
	int t=(st+dr)/2;
	if (inc<=t)
		query(nod*2,st,t);
	if (t<sf)
		query(nod*2+1,t+1,dr);
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&x);
		poz=i;
		update(1,1,n);
	}
	for (i=1; i<=m; i++)
	{
		scanf("%d%d",&inc,&sf);
		minim=100001;
		query(1,1,n);
		printf("%d\n",minim);
	}
	return 0;
}