Cod sursa(job #1125851)

Utilizator h2g2Ford Prefect h2g2 Data 26 februarie 2014 19:50:46
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <iostream>
#include <fstream>
#define nmax 100005
#define inf (1<<30)
#define logmax 20
using namespace std;

int n, m, v[nmax], log[nmax], a, b, rmq[logmax][nmax];

int solve(int a, int b) {
	int k = log[b-a+1];
	return min(rmq[k][a], rmq[k][b-(1<<k)+1]);
}

int main() {
	ifstream f("rmq.in");
	ofstream g("rmq.out");

	f>>n>>m;
	for(int i=1; i<=n; i++) f>>v[i];
	for(int i=2; i<=n; i++) log[i] = log[i/2] + 1;

	for(int i=1; i<=n; i++) rmq[0][i] = v[i];
	for(int j=1; (1<<j)<=n; j++) {
		for(int i=1; i<=n; i++) rmq[j][i] = inf;
	}

	for(int j=1; (1<<j)<=n; j++)
		for(int i=1; i<=n; i++) 
			rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i+(1<<(j-1))]);

	for(int i=1; i<=m; i++) {
		f>>a>>b;
		g<<solve(a, b)<<"\n";
	}

	return 0;
}