Cod sursa(job #1179209)

Utilizator vlasinalinVlasin Alin vlasinalin Data 28 aprilie 2014 11:00:50
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;

#define in "rmq.in"
#define out "rmq.out"

#define MAXN 100002
#define LOG_MAXN 18
#define MAXM 1000001

int n, m, arr[MAXN], st[MAXN][LOG_MAXN], logn;

int min(int a, int b)
{
	return a < b ? a : b;
}

void build_sparse_table()
{
	for (int i = 1; i <= n; ++i)
	{
		st[i][0] = arr[i];
	}

	for (int j = 1; j <= logn; j++)
	{
		for (int i = 1; i <= n; ++i)
		{
			st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
		}
	}
}

void read_input()
{
	ifstream fin(in);

	fin >> n >> m;
	logn = log2(n) + 1;
	for (int i = 1; i <= n; ++i)
	{
		fin >> arr[i];
	}		
	build_sparse_table();

	ofstream fout(out);
	int start, end, imin, ilog;
	for (int i = 0; i < m; ++i)
	{
		fin >> start >> end;
		ilog = log2(end - start + 1);
		imin = min(st[start][ilog], st[end + 1 - (1 << ilog)][ilog]);
		fout << imin << '\n';
	}

	fin.close();
	fout.close();
}


void print_debug()
{
	cout << '\n';
	for (int i = 1; i <= n; ++i)
	{
		cout << '\n';
		for (int j = 0; j <= logn; j++)
		{
			cout << st[i][j] << ' ';
		}
	}
}

void print_solution()
{
	ofstream fout(out);
	if (fout.is_open())
	{

		fout.close();
	}
}

int main()
{
	read_input();

	//resolve();

	//print_debug();

	//print_solution();

	//char x;
	//cin >> x;

	return 0;
}