Cod sursa(job #2561070)

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

ifstream in;
ofstream out;

int schema[100005][20];
vector<int> v;

void build(int n)
{
	for (int j = 1; (1<<j)<= n; j++)
	{
		for (int i = 0; i + (1 << j) - 1 < n; i++)
		{
			if (v[schema[i][j - 1]] < v[schema[i + (1 << (j - 1))][j - 1]])
				schema[i][j]=schema[i][j - 1];
			else
				schema[i][j]=schema[i + 1 << (j - 1)][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 >> x;
		v.push_back(x);
		schema[i][0]=i;
	}
	build(n);
	
	for (int i = 1; i <= m; i++)
	{
		in >> x >> y;
		out << sol(x-1, y-1) << '\n';
	}

}