Cod sursa(job #2911908)

Utilizator radu.z5Zamfirescu Radu Ioan radu.z5 Data 4 iulie 2022 16:39:09
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>


using namespace std;

void preprocess(vector<vector<int>> &table, vector<int> &v)
{
	int n = (int) v.size();
	int i, j;

	for (i = 0; i < n; i++)
		table[i][0] = i;

	for (j = 1; (1 << j) <= n; j++) {
		for (i = 0; i + (1 << j) <= n; i++) {
			int fst_half = table[i][j - 1];
			int snd_half = table[i + (1 << (j - 1))][j - 1];
			table[i][j] = v[fst_half] <= v[snd_half]
					? fst_half : snd_half;
		}
	}
}

int query(const vector<int> &v, const vector<vector<int>> &table, int i, int j)
{
	if (i == j)
		return v[j];

	int k = j - i + 1;
	int p = 0;
	int w = 1;

	while (w < k) {
		w <<= 1;
		p++;
	}
	p--;

	int m1 = v[table[i][p]];
	int m2 = v[table[j - (1 << p) + 1][p]];

	return m1 < m2 ? m1 : m2;
}

int main()
{
	ifstream in("rmq.in");
	ofstream out("rmq.out");
	int n, m, i, k = 1, lg = 0;

	in >> n >> m;
	vector<int> v(n);

	for (i = 0; i < n; i++)
		in >> v[i];

	while (k < n) {
		k <<= 1;
		++lg;
	}

	vector<vector<int>> table(n, vector<int>(lg));

	preprocess(table, v);
	int a, b;

	for (i = 0; i < m; i++) {
		in >> a >> b;
		out << query(v, table, a - 1, b - 1) << '\n';
	}

	in.close();
	out.close();
	return 0;
}