Cod sursa(job #2700480)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 27 ianuarie 2021 20:43:26
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
//ALEXANDRU MICLEA

#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>
#include <assert.h>
#include <iostream>

using namespace std;
using ll = long long;

#define fast_cin() 	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)

//VARIABLES

int v[100005];
int dp[100005][25];

int p2[25];

//FUNCTIONS



//MAIN
int main() {

	#ifdef INFOARENA
		freopen("rmq.in", "r", stdin);
		freopen("rmq.out", "w", stdout);
	#endif

	fast_cin();

	p2[0] = 1;
	for (int i = 1; i <= 20; i++) {
		p2[i] = p2[i - 1] * 2;
	}

	int n, m; cin >> n >> m;

	for (int i = 1; i <= n; i++) cin >> v[i];
	for (int i = 1; i <= n; i++) dp[i][0] = v[i];

	for (int i = n; i >= 1; i--) {
		for (int j = 1; p2[j] <= n - i; j++) {
			dp[i][j] = min(dp[i][j - 1], dp[i + p2[j - 1]][j - 1]);
		}
	}

	for (int i = 1; i <= m; i++) {
		int x, y; cin >> x >> y;

		int d = y - x + 1;
		int l = (int)log2(d);

		cout << min(dp[x][l], dp[y - p2[l] + 1][l]) << '\n';
	}

	return 0;
}