Cod sursa(job #2284037)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 16 noiembrie 2018 17:41:52
Problema Range minimum query Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>

#include<iostream>
#include<fstream>

using namespace std;

typedef struct node{
	int a, b;
	int minim;
}node;

#define MAXN 100000
#define MAXV 100000

int M,N;
int V[MAXN];
node A[262141];

#define minim(x,y) x<y?x:y

void buildtree(int root, int l,int r){
	if(l==r){
		A[root].a=l;
		A[root].b=l;
		A[root].minim=V[l];
		return;
	}
	int mid=(l+r)/2;
	A[root].a=l;
	A[root].b=r;
	buildtree(2*root+1,l,mid);
	buildtree(2*root+2,mid+1,r);
	A[root].minim=minim(A[2*root+1].minim,A[2*root+2].minim);
}

int a,b;
int findmin(int root){
	if(a<=A[root].a && b>=A[root].b)
		return A[root].minim;
	int mid=(A[root].a+A[root].b)/2;
	int min1=MAXV,min2=MAXV;
	if(a<=mid)
		min1=findmin(root*2+1);
	if(b>mid)
		min2=findmin(root*2+2);
	return minim(min1,min2);
}

int main(){
	
	freopen("rmq.in", "r", stdin);
	//freopen("arbint_test5.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

	scanf("%d %d", &N,&M);

	for(int i=0;i<N;i++)
		scanf("%d", &V[i]);

	buildtree(0,0,N-1);

	int x,y,min;
	for(int i=0;i<M;i++){
		scanf("%d %d",&x,&y);
		a=x-1;
		b=y-1;
		min=findmin(0);
		printf("%d\n",min);
	}
	
	return 0;
}