Cod sursa(job #345394)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 2 septembrie 2009 20:42:01
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <stdlib.h>
#define N 1<<18
#define M 1<<20
int v[N],minim,inc,sf,poz,n,m,x,ordine[M],rasp[M];
struct intrebare
{
	int a,b;
};
intrebare t[M];
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 compar(const void *p,const void *q)
{
	int x=*(int*)p;
	int y=*(int*)q;
	if (t[x].a<t[y].a)
		return -1;
	if (t[x].a>t[y].a)
		return 1;
	if (t[x].b<t[y].b)
		return -1;
	if (t[x].b>t[y].b)
		return 1;
	return 0;
}
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",&t[i].a,&t[i].b);
		ordine[i]=i;
	}
	qsort(ordine+1,m,sizeof(ordine[0]),compar);
	for (i=1; i<=m; i++)
	{
		if (t[ordine[i]].a==t[ordine[i-1]].a && 
			t[ordine[i]].b==t[ordine[i-1]].b)
				rasp[ordine[i]]=minim;
		else
		{
			inc=t[ordine[i]].a;
			sf=t[ordine[i]].b;
			minim=100001;
			query(1,1,n);
			rasp[ordine[i]]=minim;
		}
	}
	for (i=1; i<=m; i++)
		printf("%d\n",rasp[i]);
	return 0;
}