Cod sursa(job #1005651)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 octombrie 2013 14:12:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<fstream>
#define min(a,b) a < b ? a : b
#define minV(a,b) v[a] < v[b] ? a : b
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int N = 100005;
const int LOGN = 20;
int M[LOGN][N];
int lg[N],v[N];
int n,m;
int doila(int x){return 1<<x;}
void processRMQ(){
	int i,j;
	for(j=1;j<=n;j++) M[0][j]=j;
	for(i=1;i<=lg[n];i++){
		for(j=1;j<=n-doila(i)+1;j++){
			M[i][j]=minV(M[i-1][j],M[i-1][j+doila(i-1)]);
		}
	}
}
int RMQ(int i,int j){
	int dist=j-i+1;
	int l=lg[dist];
	int p=dist-doila(l);
	return min(v[M[l][i]],v[M[l][i+p]]);
}
int main(){
	in>>n>>m;
	in>>v[1];
	for(int i=2;i<=n;i++){
		in>>v[i];
		lg[i]=lg[i/2]+1;
	}
	processRMQ();
	for(;m;--m){
		int x,y;
		in>>x>>y;
		out<<RMQ(x,y)<<'\n';
	}
}