Cod sursa(job #2616591)

Utilizator rusuandrei32Rusu Andrei-Cristian rusuandrei32 Data 18 mai 2020 23:37:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

#define itr(type, i, s, d) for (type i = s; i < d; ++i)
#define itrr(i, s, d) for (register int i = s; i < d; ++i)
#define pb(i) push_back(i)
#define IO ios_base :: sync_with_stdio(false); \
cin.tie(nullptr);
#define vi vector <int>
#define rvi(s, d, v) \
itrr(i, s, d) \
	cin >> v.at(i);
#define show(v) \
cout << "Debug:\n"; \
for (auto it = v.begin(); it != v.end(); ++it) \
	cout << *it << " "; \
cout << "\n";
#define vitr(v, it) \
for (auto it = v.begin(); it != v.end(); ++it)

typedef long long ll;

int main() {
	IO;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	int N, M, L, R, K, lg;

	scanf("%d %d", &N, &M);

	K = ceil(log2(N));

	vector <int> vec(N);

	itrr(i, 0, N)
		scanf("%d", &vec[i]);

	vector <int> Logs(N + 1);
	Logs.at(1) = 0;
	itrr(i, 2, N + 1)
		Logs.at(i) = Logs.at(i / 2) + 1;

	int dp[N + 1][K + 1];

	itrr(i, 0, N)
		dp[i][0] = vec.at(i);

	itrr(j, 1, K + 1)
		for (int i = 0; i + (1 << j) <= N; ++i)
			dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);

	while (M--) {
		scanf("%d %d", &L, &R);
		L--;
		R--;
		lg = Logs[R - L + 1];
		printf("%d\n", min(dp[L][lg], dp[R - (1 << lg) + 1][lg]));
	}

	return 0;
}