Cod sursa(job #334728)

Utilizator szabotamasSzabo Tamas szabotamas Data 27 iulie 2009 20:41:22
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>

#define NMAX 100002
#define LMAX 18

using namespace std;

long lg[NMAX],n,m,a[NMAX],x,y;

class rmq{
		long t[LMAX][NMAX];
	public:
		rmq(long* a);
		long minim(long &x, long &y);
	
};

rmq::rmq(long* a){
	for (long j=1; j<=n; j++){
		t[0][j]=a[j];
	}
	for (long i=1; 1 << i <=n; i++){
		for (long j=1; j<=n; j++){
			t[i][j]=min(t[i-1][j],t[i-1][j+1]);
		}
	}
}

long rmq::minim(long &x, long &y){
	long k=(y-x+1)-(1<<lg[y-x+1]);
	return min(t[lg[y-x+1]][x],t[lg[y-x+1]][x+k]);
}


int main(){
	ifstream fin ("rmq.in");
	ofstream fout ("rmq.out");
		fin >> n >> m;
		for  (long i=1; i<=n; i++)
			fin >> a[i];
		
		int lg[NMAX];
		for (long i=1; i<=n; i++){
			lg[i]=lg[i/2]+1;
		}
		rmq seq(a);
		for (long l=1; l<=m; l++){
			fin >> x >> y;
			fout << seq.minim(x,y) << "\n";
		}
	fin.close();
	fout.close();
}