Cod sursa(job #370305)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 30 noiembrie 2009 19:30:55
Problema Range minimum query Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#define infile "rmq.in"
#define outfile "rmq.out"
#define nmax (200*1001)
#define inf ~(1<<31)
int arb[nmax]; //arborele
int n; //numarul de elemente
int poz,val; //pentru un update
int a,b; //interval cautare

inline int min(int a, int b)
{
	if(a<b) return a; return b;
}

void update(int rad, int st, int dr)
{
	if(st==dr) { arb[rad]=val; return; }
	int mij=(st+dr)>>1;
	arb[rad]=inf;
	if(poz<=mij && (rad<<1)<nmax) update(rad<<1,st,mij);
	if(mij<poz && ((rad<<1)|1)<nmax) update((rad<<1)|1,mij+1,dr);
	if((rad<<1)<nmax && arb[rad<<1]<arb[rad]) arb[rad]=arb[rad<<1];
	if(((rad<<1)|1)<nmax && arb[(rad<<1)|1]<arb[rad]) arb[rad]=arb[(rad<<1)|1];
}

int query(int rad, int st, int dr)
{
	if(a<=st && dr<=b) return arb[rad];
	int mij=(st+dr)>>1;
	int val=inf;
	if(a<=mij && (rad<<1)<nmax) val=min(val,query(rad<<1,st,mij));
	if(mij<b && ((rad<<1)|1)<nmax) val=min(val,query((rad<<1)|1,mij+1,dr));
	return val;
}

int main()
{
	int t;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d %d\n",&n,&t);
	
	//citim sirul initial
	for(poz=1;poz<=n;poz++)
	{
		scanf("%d\n",&val);
		update(1,1,n);
	}
	
	//raspundem la query-uri
	while(t--)
	{
		scanf("%d %d\n",&a,&b);
		printf("%d\n",query(1,1,n));
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}