Cod sursa(job #1341686)

Utilizator anaid96Nasue Diana anaid96 Data 12 februarie 2015 23:55:03
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *in, *out;

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

//constants
const int sz = (int) 4e5+1;
const int oo = (1<<30)-1;

//variables
int n, quest;
int val, poz;

int tree[sz];

int lim1, lim2;

//functions
void arb(int node, int left, int right);
void query(int node, int left, int right);

int main(void)
{
	in = fopen("rmq.in", "rt");
	out = fopen("rmq.out", "wt");
	
	fscanf(in, "%d%d", &n, &quest);
	
	for( poz=1; poz<=n; ++poz)
	{
		fscanf(in, "%d", &val);
		arb(1, 1, n);
	}
	
	while(quest--)
	{
		fscanf(in,"%d%d", &lim1, &lim2);
		val = oo;
		query(1, 1, n);
		fprintf(out, "%d\n",val);
	}
	
	fclose(in);
	fclose(out);
	return 0;
}

void arb(int node, int left, int right)
{
	if( left == right)
	{
		tree[node] = val;
		return;
	}
	
	int mid = (left+right) / 2;
	
	if( poz <= mid)
		arb(leftSon, left, mid);
	else
		arb(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( mid >= lim1)
		query(leftSon, left, mid);
	if( mid < lim2)		
		query(rightSon, mid+1, right);
}