Cod sursa(job #2900295)

Utilizator AlexePaulAlexe Paul AlexePaul Data 10 mai 2022 18:36:32
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O3,inline")
#define FILE "rmq"

using namespace std;

ifstream fin(FILE".in");
ofstream fout(FILE".out");

pair<int, pair<int, int > > rmq[562000];
int N,x,y,M;

void insert(int val, int pos, int posInRMQ, int st, int dr){
	if(st == dr){
		rmq[posInRMQ].first = val;
		return;
	}
	if(pos <= (st+dr)/2){
		insert(val, pos, posInRMQ*2, st, (st+dr)/2);
		rmq[posInRMQ].first = min(rmq[posInRMQ*2].first, rmq[posInRMQ*2 + 1].first);
		}
	if(pos >= (st+dr)/2){
		insert(val, pos, posInRMQ*2 + 1, (st+dr)/2+1, dr);
		rmq[posInRMQ].first = min(rmq[posInRMQ*2].first, rmq[posInRMQ*2 + 1].first);
	}
}

int getMinValue(int x, int y, int pos){
	if(x <= rmq[pos].second.first && y >= rmq[pos].second.second)
		return rmq[pos].first;
	else if(rmq[pos].second.first <= y && rmq[pos].second.second >= x)
		return min(getMinValue(x,y,2*pos),getMinValue(x,y,2*pos+1));
	return INT_MAX;
	
}

void preprocess(int st = 0, int dr = N-1, int pos = 1){
	rmq[pos].second.first = st+1;
	rmq[pos].second.second = dr+1;
	rmq[pos].first = INT_MAX;
	if(st == dr)
		return;
	preprocess(st, (st+dr)/2, pos*2);
	preprocess((st+dr)/2+1, dr, pos*2 + 1);
}

int main(){
	fin >> N >> M;
	ios::sync_with_stdio(false);
	preprocess();
	for(int i = 0; i < N; ++i){
		fin >> x;
		insert(x, i, 1, 0, N-1);
	}
	for(int i = 0; i < M; ++i){
		fin >> x >> y;
		fout << getMinValue(x,y,1) << '\n';
	}
	
}