Cod sursa(job #1983890)

Utilizator borcanirobertBorcani Robert borcanirobert Data 22 mai 2017 18:49:36
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
// Borcani Robert Raul
/*	Folosesc un sir M[i] = pozitia min( a[i*sqrt(N)], a[i*sqrt(N) + 1], ... a[(i + 1)*sqrt(n) - 1]
 * 	Complexitate : - timp : O(N*sqrt(N))
 * 				   - memorie : o(N)
 * */
#include <fstream>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;

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

int N, Q;
vector<int> a, M;
int n; // = sqrt(N);

void Read();
void Precalculate();
void AnswerQuery( int x, int y );

int main()
{
	Read();
	Precalculate();
	
	int x, y;
	while ( Q-- )
	{
		fin >> x >> y;
		AnswerQuery(x - 1, y - 1);
	}
	
	fin.close();
	fout.close();
	return 0;
}


void Read()
{
	int x;
	fin >> N >> Q;
	for ( int i = 1; i <= N; ++i )
	{
		fin >> x;
		a.push_back(x);
	}
}

void Precalculate()
{
	n = sqrt(N);
	int i, j;
	for ( i = 0; i*n < N; ++i )
	{
		int minim{a[i*n]}, p = i*n;
		for ( j = i*n + 1; j < (i + 1)*n && j < N; ++j )
			if ( a[j] < minim )
			{
				minim = a[j];
				p = j;
			}
			
		M.push_back(p);
		//fout << p << ' ';
	}
}

void AnswerQuery( int x, int y )
{
	int r{a[x]};
	while ( x % n != 0 && x <= y )
	{
		r = min( r, a[x] );
		++x;
	}
	while ( x + n - 1 <= y )
	{
		r = min( r, a[M[x / n]] );
		x += n;
	}
	while ( x <= y )
	{
		r = min( r, a[x] );
		++x;
	}
	
	fout << r << '\n';
}