Cod sursa(job #1486427)

Utilizator DacianBocea Dacian Dacian Data 14 septembrie 2015 20:45:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
#include <cmath>
using namespace std;
int a[100010], v[100010];
int m, c, N, index;
int M[1000010][20];
void rmq(){
	for (int i = 0; i < N; ++i)
		M[i][0] = i;
	for (int j = 1; (1 << j) <= N; ++j)
	for (int i = 0; i + (1 << j) - 1 < N; ++i)
	if (a[M[i][j - 1]] < a[M[i + (1 << (j - 1))][j - 1]])
		M[i][j] = M[i][j - 1];
	else M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
int main(){
	ifstream f("rmq.in");
	ofstream of("rmq.out");
	f >> N >> m;
	int k, pow;
	for (int i = 2; i <= N; i++){
		v[i] = 1 + v[i / 2];
	}
	for (int i = 0; i < N; ++i)
		f >> a[i];
	rmq();
	for (int i = 0; i < m; ++i){
		f >> c >> N;
		--c; --N;
		k = v[N - c + 1];
		index = (a[M[c][k]] <= a[M[N - (1<<k) + 1][k]]) ? M[c][k] : M[N - (1<<k) + 1][k];
		of << a[index] << "\n";
	}
	return 0;
}