Cod sursa(job #1115946)

Utilizator anaid96Nasue Diana anaid96 Data 22 februarie 2014 11:06:33
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *in,*out;

//functii
void update(int node, int left,int right);
void query(int node,int left,int right);

//definitii
#define leftSon 2*node
#define rightSon 2*node+1

//constate
const int Nmax=(int) 4e5+1;
const int oo=(1<<30)-1;

//variabile
int elemente,intrebari;
int tree[Nmax];
int pos,val;
int lim1,lim2;

int main(void)
{
	in=fopen("rmq.in" ,"rt");
	out=fopen("rmq.out", "wt");
	
	fscanf(in, "%d%d", &elemente, &intrebari);
	for(pos=1 ; pos<=elemente ; ++pos)
	{
		fscanf(in, "%d", &val);
		update(1,1,elemente);
	}	
	while(intrebari--)
	{
		fscanf(in, "%d%d", &lim1,&lim2);
		val=oo;
		query(1,1,elemente);
		fprintf(out,"%d\n",val);
		
	}
}	

void update(int node,int left,int right)
{
	if(left==right)
	{
		tree[node]=val;
		return;
	}
	int mid=(left+right)/2;
	if(pos<=mid)
		update(leftSon,left,mid);
	else
		update(rightSon,mid+1,right);
	tree[node]=min(tree[leftSon], tree[rightSon]);
}

void query(int node,int left,int right)
{
	if(lim1<=left && right<=lim2)
	{
		val=min(val,tree[node]);
		return;
	}
	int mid=(left+right)/2;
	
	if(lim1<=mid)
		query(leftSon,left,mid);
	if(mid<lim2)
		query(rightSon,mid+1,right);
}