Cod sursa(job #541954)

Utilizator zizou_adyIacov Adrian zizou_ady Data 25 februarie 2011 16:55:23
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#include <cmath>
using namespace std;

#define DIM 100001

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int a[DIM];
int r[DIM][17];

int n, m;

void Read();
void Solve();
int RMQ(int i, int j);

int main()
{
	Read();
	fin.close();
	fout.close();
	return 0;
}

void Read()
{
	fin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		fin >> a[i];
	}
	Solve();
	for ( int i = 1; i <= m; ++i)
	{
		int x, y;
		fin >> x >> y;
		fout << RMQ(x-1, y-1) << '\n';
	}
}

void Solve()
{
	for (int i = 0; i < n; ++i)
		r[i][0] = i;
	for (int j = 1; 1 << j  <= n; ++j)
		for (int i = 0; i + (1 << j) - 1 < n; ++i)
		{
			if (a[r[i][j - 1]] < a[r[i + (1 << (j - 1))][j - 1]])
				r[i][j] = r[i][j - 1];
			else
				r[i][j] = r[i + (1 << (j - 1))][j - 1];
		}
}

int RMQ(int i, int j)
{
	int k =(int) log2(j-i + 1);
	if (a[r[i][k]] <= a[r[j - (1 << k) + 1][k]])
		return a[r[i][k]];
	else
		return a[r[j - (1 << k) + 1][k]];
}