Cod sursa(job #1044029)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 29 noiembrie 2013 10:39:43
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
using namespace std;


#define NMAX 100001

int maximPow[NMAX];
void calc ()
{
	maximPow[1] = 0;
	for (int i = 2; i < NMAX; i++)
		maximPow[i] = maximPow[i/2] + 1;
}

inline int minim (int a, int b)
{
	if ( a < b )
		return a;
	else
		return b;
}

int main()
{
	int n, m, rmq[18][NMAX];
	FILE *f = fopen ("rmq.in", "r");
	FILE *g = fopen ("rmq.out", "w");
	
	fscanf (f, "%d %d", &n, &m); 
	
	for (int i = 1 ; i <= n; i++)
	{
		fscanf(f, "%d", &rmq[0][i]);
	}
	int limit = maximPow[n];
	for (int i = 1; i <= limit; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			rmq[i][j] = minim ( rmq[i-1][j], rmq[i-1][j + (1<<(i-1))] );
		}
	}
	
	int x, y;
	for (int i = 0; i < m; i++ )
	{
		fscanf(f, "%d %d", &x, &y);
		int len = y - x + 1; 
		limit = maximPow[len];
		fprintf(g, "%d\n", minim ( rmq[limit][x], rmq[limit][1 + y - (1<<limit)]) );
	}

	fclose(f); 
	fclose(g);
	return 0;
}