Cod sursa(job #2538182)

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

using namespace std;

const int NMAX = 100005;

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

int pow[20];
int kmax;

int log(int x){
	int st=0,dr=kmax,mid;
   	while(st<dr){
		mid=(st+dr)/2;
		if(pow[mid]==x)
			return mid;
		else
			if(pow[mid]<x)
				st=mid+1;
			else
				dr=mid-1;
	}	
	return dr;
}

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];
	}

	pow[0]=1;
	int k;
	for(k=1 ;(1<<k) <=n ;++k){
		pow[k]=pow[k-1]*2;
		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=log(b-a+1);
		printf("%d\n",min(rmq[k][a],rmq[k][b-(1<<k)+1]));
	}
	return 0;
}