Cod sursa(job #3001686)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 13 martie 2023 20:51:20
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 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 logMaxim = lg[dr] - lg[st];
	int pozDr = dr - (1 << logMaxim) + 1;
	return min(rmq[logMaxim][st], rmq[logMaxim][pozDr]);
}

int main()
{
	fin = fopen("rmq.in", "r");
	fout = fopen("rmq.out", "w");
	
	fscanf(fin, "%d %d", &n, &m);
	lg[0] = 0;
	for (int i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &rmq[0][i]);
		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;
}