Cod sursa(job #2655422)

Utilizator ViAlexVisan Alexandru ViAlex Data 4 octombrie 2020 13:08:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");

int num_values,num_queries,values[1000000];
int rmq[1000000][30];

void read(){
	in>>num_values>>num_queries;
	for(int i=0;i<num_values;i++)
		in>>values[i];
}


void preprocess(){
	for(int i=0;i<num_values;i++){
		rmq[i][0]=values[i];
	}
	for(int i=1;(1<<i)<=num_values;i++){
		int pw=1<<i;
		int lpw=1<<(i-1);
		for(int k=0;k<=num_values-pw;k++){
			rmq[k][i]=min(rmq[k][i-1],rmq[k+lpw][i-1]);
		}
	}
}



int query(int left, int right){
	int dist=right-left+1;
	int lg=log2(dist);
	return min(rmq[left][lg],rmq[right-(1<<(lg))+1][lg]);
}


int main(){
	read();
	preprocess();
	int a,b;
	for(int i=0;i<num_queries;i++){
		in>>a>>b;
		out<<query(a-1,b-1)<<'\n';
	}
	return 0;
}