Cod sursa(job #1903896)

Utilizator xSliveSergiu xSlive Data 5 martie 2017 13:08:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <math.h>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstring>
#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[i] = lg[i >> 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[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + (1 << (i - 1))]);
			}
			else
			{
				RMQ[i][j] = RMQ[i - 1][j];
			}
		}
	}

	for (int i = 0; i <= lg[n];i++)
	{
		for (int j = 1; j <= n; j++)
			cout << RMQ[i][j] << ' ';
		cout << '\n';
	}
}

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();
	getchar();
	return 0;
}