Cod sursa(job #3001697)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 13 martie 2023 20:57:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>

#define NMAX 100003
#define LOGMAX 103 
using namespace std;

FILE* fin, * fout;

int n, m;
int rmq[LOGMAX][NMAX];
int lg[NMAX];

void build()
{
	for (int lg = 1; (1<<lg) <= n; lg++) {
		for (int j = 1; j + (1 << lg) -1 <= n; j++)
		{
			rmq[lg][j] = min(rmq[lg-1][j], rmq[lg - 1][j + (1 << (lg - 1))]);
		}
	}
}

int query(int st, int dr)
{
	int lung = dr - st + 1;
	int logMax = lg[lung];
	int pozDr = dr - (1 << logMax) + 1;
	return min(rmq[logMax][st], rmq[logMax][pozDr]);
}

int main()
{
	fin = fopen("rmq.in", "r");
	fout = fopen("rmq.out", "w");
	
	fscanf(fin, "%d %d", &n, &m);
	lg[1] = 0;
	for (int i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &rmq[0][i]);
		if (i > 1)
		{
			lg[i] = lg[i / 2] + 1;

		}
	}
	build();
	
	for (int i = 1; i <= m; i++)
	{
		int x, y;
		fscanf(fin, "%d %d", &x, &y);
		fprintf(fout, "%d\n", query(x, y));
	}
	return 0;
}