Cod sursa(job #3177854)

Utilizator RusuRRusu Rares RusuR Data 30 noiembrie 2023 12:45:23
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.71 kb
#include <bits/stdc++.h>

std::ifstream h("rmq.in");
std::ofstream g("rmq.out");

const int MLOG=18;
const int SIZE=100000;
int v[SIZE+1];
int t[SIZE+1][MLOG+1];

inline int f(int a, int b){
	return a<b ? a : b;
}

inline int log2(int x){
	int r=0;
	while(x>1){
		x/=2;
		++r;
	}
	return r;
}

void build(int n){
	int p=0,i;
	for(i=1;i<=n;i++)
		t[i][0]=v[i];
	for(p=1;p<MLOG;p++)
		for(i=1;i<=n;i++)
			t[i][p]=f(t[i][p-1],t[i+(1<<(p-1))][p-1]);	
}

int query(int left, int right){
	int l, log;
	l=right-left+1;
	log=log2(l);
	return f(t[left][log],t[right-(1<<log)+1][log]);
}

int main(){
	int n,q;
	h>>n>>q;
	for(int i=1;i<=n;i++)
		h>>v[i];
	build(n);
	while(q--){
		int a, b;
		h>>a>>b;
		g<<query(a,b)<<'\n';
	}
	return 0;
}