Cod sursa(job #700785)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 1 martie 2012 11:57:10
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
struct nod{
	int nr,poz;
	nod *st,*dr;
}*r;
int n,m,inf=99999;
void insert(nod *&r,int nr,int poz){
	if(r==0){
		r=new nod;
		r->nr=nr;
		r->poz=poz;
		r->st=0;
		r->dr=0;
	}
	else
		if(nr<r->nr)
			insert(r->st,nr,poz);
		else
			if(nr>r->nr)
				insert(r->dr,nr,poz);
}
int minim(int a,int b,int c){
	int min=a;
	if(min>b)
		min=b;
	if(min>c)
		min=c;
	return min;
}
int find(nod *r,int x,int y){
	int a=inf,b=inf;
	if(r){
		int c=r->nr;
		if(r->poz<=y){
			if(x<=r->poz){
				if(r->st)
					a=find(r->st,x,y);
				if(a<c)
					return a;
				return c;
			}
			a=find(r->st,x,y);
			b=find(r->dr,x,y);
		}
	}
	if(a<b)
		return a;
	return b;
}

void read(){
	freopen("rmq.in","r",stdin);
	scanf("%d %d\n",&n,&m);
	int i,x,y;
	for(i=1;i<=n;i++){
		scanf("%d\n",&x);
		insert(r,x,i);
	}
	for(i=1;i<=m;i++){
		scanf("%d %d\n",&x,&y);
		printf("%d\n",find(r,x,y));
	}
	fclose(stdin);
}
void write(nod *r){
	if(r){
		write(r->st);
		printf("%d ",r->poz);
		write(r->dr);
	}
}
int main(){
	freopen("rmq.out","w",stdout);
	read();
	fclose(stdout);
	return 0;
	
}