Cod sursa(job #1132740)

Utilizator antonioteoZait Teodor Antonio antonioteo Data 3 martie 2014 21:07:29
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

#define INF 0x3f3f3f3f
#define nmax 200001
#define lmax 21

int i, j, k, N, M;
int nr, p, cnt;
int a, b;

int v[nmax];
int Log[nmax];
int dp[lmax][nmax];

int main() {
	fin >> N >> M;
	for (i = 1; i <= N; ++i) fin >> v[i];
	for (i = 2; i <= N; ++i) Log[i] = Log[(i >> 1)] + 1;
	memset(dp, INF, sizeof(dp));
	for (i = 1; i <= N; ++i) 
		dp[0][i] = v[i];
	for (cnt = 1; cnt <= N; cnt <<= 1);
	for (i = 1; i <= cnt; ++i) {
		for (j = 1; j + (1 << i) - 1 <= N; ++j)
			dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
	}
	for (i = 1; i <= M; ++i) {
		fin >> a >> b;
		if (b < a) swap(a, b);
		p = Log[b - a];
		fout << min(dp[p][a], dp[p][b - (1 << p) + 1]) << '\n';
	}
	return 0;
}