Cod sursa(job #1426184)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 29 aprilie 2015 06:44:55
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
using namespace std;

#define R(x) x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x

constexpr int trunchi_log_tab[] = {-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
	R(4), R(5), R(5), R(6), R(6), R(6), R(6), R(7), R(7), R(7), R(7),
	R(7), R(7), R(7), R(7)};

int trunchi_log(const int x){
	int t, tt;
	if(t = (x>>16)){
		return (tt = t>>8) ? trunchi_log_tab[tt]<<24 : trunchi_log_tab[t]<<16; }
	else{
		return (t = x>>8) ? trunchi_log_tab[t]<<8 : trunchi_log_tab[x]; } }

void make_rmq(const vector<int>& v, vector<vector<int> >& rmq){
	const int n = v.size();
	rmq.resize(n);
	for(int i = n-1, sz = 1, left = 1; i >= 0; --i, --left){
		if(left == 0){
			++sz;
			left = (1<<(sz-1)); }
		rmq[i].resize(sz);
		rmq[i][0] = v[i]; }
	for(int marime = 1; marime < rmq.front().size(); ++marime){
		for(int i = 0; marime < rmq[i].size(); ++i){
			rmq[i][marime] = min(rmq[i][marime-1], rmq[i+1<<(marime-1)][marime-1]); } } }

int query(const vector<vector<int> >& rmq, const int s, const int d){
	const int dst = trunchi_log(d-s+1);
	return min(rmq[s][dst], rmq[d-(1<<dst)+1][dst]); }

int main(){
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	int n, m;
	f >> n >> m;
	vector<int> v(n, 0);
	for(auto& x : v){
		f >> x; }
	vector<vector<int> > rmq;
	make_rmq(v, rmq);
	for(int i = 0, a, b; i < m; ++i){
		f >> a >> b;
		g << query(rmq, a-1, b-1) << '\n'; }
	return 0; }