Cod sursa(job #2216820)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 28 iunie 2018 02:16:02
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

const int MAXN = 1e5;
const int MAXM = 1e6;
const int MAX2 = 18;

int n, m;
int v[MAXN + 1];
int dp[MAXN + 1][MAX2];
int p[18];

void precalc() {
	p[0] = 1;
	for (int i = 1; i < MAX2; ++ i) {
		p[i] = p[i - 1] * 2;
	}
}


int main() {
	in >> n >> m;
	int put = 1;
	while (put <= n)
    put <<= 1;
  put >>= 1;
  precalc();

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


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

	int x, y, l;
	for (int i = 1; i <= m; ++ i) {
		in >> x >> y;
		l = y - x + 1;
		for (int j = 0; j < MAX2 && p[j] <= l; ++ j) {
			put = j;
		}
		out << min(dp[x][put], dp[y - p[put] + 1][put]) << '\n';
	}

  return 0;
}