Cod sursa(job #1508096)

Utilizator AlexandraaaaMereu Alexandra Alexandraaaa Data 22 octombrie 2015 12:04:08
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define fs(i) i << 1
#define fd(i) (i << 1) + 1
#define maxN 100000*4

using namespace std;

int A[maxN];

void update(int l, int r, int i, int p, int v){
	if (l == r){
		A[i] = v;
		return;
	}

	int m = (l + r) >> 1;
	if (p <= m)
		update(l, m, fs(i), p, v);
	else
		update(m + 1, r, fd(i), p, v);

	A[i] = min(A[fs(i)], A[fd(i)]);
}

int vezi(int l, int r, int a, int b, int i){
	if (l >= a && r <= b){
		return A[i];
	}

	int m = (l + r) >> 1;
	int v1, v2;
	v1 = v2 = 100050;
	if (m >= a) v1 = vezi(l, m, a, b, fs(i));
	if (m < b) v2 = vezi(m + 1, r, a, b, fd(i));

	return min(v1, v2);
}

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

	int n, m;
	f >> n >> m;
	for (int i = 1; i <= n; ++i){
		int x;
		f >> x;
		update(1, n, 1, i, x);
	}

	for (int i = 0; i < m; ++i){
		int x, y;
		f >> x >> y;
		g << vezi(1, n, x, y, 1) << "\n";
	}

	f.close();
	g.close();

	return 0;
}