Cod sursa(job #334739)

Utilizator szabotamasSzabo Tamas szabotamas Data 27 iulie 2009 21:32:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>

#define NMAX 100002
#define LMAX 18

using namespace std;

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

class rmq{
	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-(1<<i)+1; j++){
			t[i][j]=min(t[i-1][j],t[i-1][j+(1<<(i-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 () {
	x=1;
	y=1;
	x=y;
	ifstream fin ("rmq.in");
	ofstream fout ("rmq.out");
		fin >> n >> m;
		for  (long i=1; i<=n; i++)
			fin >> a[i];
		lg[1]=0;
		for (long i=2; i<=n; i++){
			lg[i]=lg[i/2]+1;
		}
		rmq seq(a);
		for (long p=1; p<=m; p++){
			fin >> x >> y;
			fout << seq.minim(x,y) << "\n";
		}
	fin.close();
	fout.close();
	return 0;
}