Cod sursa(job #1903783)

Utilizator xSliveSergiu xSlive Data 5 martie 2017 12:50:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>
#define N 100010
#define M 1000010
#define LOGN 
using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

vector<int> lg(N);


int n,m;
int RMQ[20][N];

void preprocess()
{
	lg[1] = 0;
	f >> RMQ[0][1];
	for (int i = 2; i <= n; i++)
	{
		lg[n] = lg[n >> 1] + 1;
		f >> RMQ[0][i];
	}
	
	for (int i = 1; i < lg[n];i++)
	{
		for (int j = 1; j <= n;j++)
		{
			if(j + (1<<i) <= n)
			{
				RMQ[j][i] = min(RMQ[j][i - 1], RMQ[j + (1 << (i - 1))][i - 1]);
			}
			else
			{
				RMQ[j][i] = RMQ[j][i - 1];
			}
		}
	}
}

int querry(int li,int ls)
{
	int dif = ls - li + 1;
	if ((dif &(dif - 1)) == 0)
		return RMQ[lg[dif]][li];
	else
	{
		return min(
			RMQ[lg[dif]][li],
			RMQ[lg[dif]][li + (dif - (1 << lg[dif]))]
			);
	}
}

void prelucrare()
{
	int li, ls;
	f >> n >> m;
	preprocess();
	for (int i = 0; i < m;i++)
	{
		f >> li >> ls;
		g << querry(li, ls) << '\n';
	}
	f.close();
	g.close();
}

int main()
{
	prelucrare();
}