Cod sursa(job #186783)

Utilizator Spike7d8Cristian Varvara Spike7d8 Data 28 aprilie 2008 19:38:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <cstdlib>
#define min(a, b) (a < b? a: b)

int v[400384], sol;
char *buffer, *current;


void update(int n, int l, int r, int p, int x)
{
	if (l == r)
		v[n] = x;
	else
	{
		int m = (l + r) / 2;
		if (p <= m)
			update(2 * n, l, m, p, x);
		else
			update(2 * n + 1, m + 1, r, p, x);
		v[n] = min(v[2 * n], v[2 * n + 1]);
	}
}


void query(int n, int l, int r, int a, int b)
{
	if (a <= l && r <= b)
		sol = min(sol, v[n]);
	else
	{
		int m = (l + r) / 2;

		if (a <= m)
			query(2 * n, l, m, a, b);
		if (m < b)
			query(2 * n + 1, m + 1, r, a, b);
	}
}


int fileSize(char *filename)
{
	FILE *file = fopen(filename, "rb");
	if (!file)
		return -1;

	fseek(file, 0, SEEK_END);
	int size = ftell(file);

	fclose(file);
	return size;
}


int get()
{
	int neg = 0;

	while ((*current < '0' || '9' < *current) && *current != '-')
		current++;

	if (*current == '-')
	{
		neg = 1;
		current++;
	}

	int n = 0;
	while ('0' <= *current && *current <= '9')
		n = n * 10 + *(current++) - '0';

	if (neg)
		return -n;
	else
		return n;
}


void read(char *filename)
{
	int size = fileSize(filename);
	buffer = (char *)malloc(size);
	current = buffer;
	FILE *file = fopen(filename, "rb");
	fread(buffer, 1, size, file);
	fclose(file);
}


int main()
{
	read("rmq.in");
	freopen("rmq.out", "wt", stdout);

	int n = get();
	int m = get();

	for (int a, i = 1; i <= n; i++)
	{
		a = get();
		update(1, 1, n, i, a);
	}

	while (m--)
	{
		int a = get();
		int b = get();
		sol = 0x3f3f3f3f;
		query(1, 1, n, a, b);
		printf("%d\n", sol);
	}

	return 0;
}