Cod sursa(job #2562984)

Utilizator CriviCriveanu Bogdan Crivi Data 29 februarie 2020 20:57:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
#define vec vector<vector<int>>
using namespace std;

ifstream in;
ofstream out;

int schema[100005][20];
int  v[100005];

void build(int n)
{
	for (int j = 1; (1 << j) <= n; j++)
	{
		int k = 1 << j;
		int k1= 1 << (j-1);
		for (int i = 0; (i + k - 1) < n; i++)
		{
			if (v[schema[i][j - 1]] < v[schema[i + k1][j - 1]])
				schema[i][j] = schema[i][j - 1];
			else
				schema[i][j] = schema[i + k1][j - 1];
		}
	}
}
int sol(int low, int high)
{
	int l = high - low + 1;
	int k = log2(l);

	if (v[schema[low][k]] <= v[schema[low + l - (1 << k)][k]])
		return v[schema[low][k]];
	else
		return v[schema[high - (1 << k) + 1][k]];

}
int n, m, x, y;

int main()
{
	in.open("rmq.in");
	out.open("rmq.out");

	in >> n >> m;
	for (int i = 0; i < n; i++)
	{
		in >> v[i];
		schema[i][0] = i;
	}
	build(n);
	/*for (int i = 0; i < n; i++)
	{
		for (int j = 0; (1 << j) <= n; j++)
			out << schema[i][j] << " ";
		out << endl;
	}*/
	for (int i = 1; i <= m; i++)
	{
		in >> x >> y;
		out << sol(x-1, y-1) << '\n';
	}
}