Cod sursa(job #2538191)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 4 februarie 2020 15:15:46
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int NMAX = 100005;

long long rmq[20][NMAX];
int v[NMAX];

int kmax;

int main(){
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	int n,m;
	scanf("%d%d",&n,&m);

	for(int i=0;i<n;++i){
		scanf("%d",&v[i]);
		rmq[0][i]=v[i];
	}

	int k;
	for(k=1 ;(1<<k) <=n ;++k){
		for(int i=0 ;i+(1<<k)<=n ;++i)
			rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
			//rmq[k][i]=rmq[k-1][i]+rmq[k-1][i+(1<<(k-1))];
		}
	kmax=k;

	int a,b;
	for(;m;m--){
		scanf("%d%d",&a,&b);
		a--,b--; //cause of 0 indexing
		
	//	int sum=0;
	//	for(int k=kmax;k>=0;--k)
	//		if((1<<k)<=b-a+1){
	//			sum+=rmq[k][a];
	//			a+=(1<<k);
	//		}

		int k=log2(b-a+1);
		printf("%lld\n",min(rmq[k][a],rmq[k][b-(1<<k)+1]));
	}
	return 0;
}