Cod sursa(job #591234)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 23 mai 2011 11:37:12
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
# include <cstdio>
using namespace std;

int H[300010], n, m, v[100003];

inline int maxim (int a, int b){
	if (a < b) return a;
	return b;
}

inline void update2 (int st, int dr, int i, int val, int node){
	if (st >= dr){
		H[node] = val;
		return ;
	}
	
	int m = (st + dr) >> 1;
	
	if (i <= m)
		update2 (st, m, i, val, (node << 1));
	else
		update2 (m + 1, dr, i, val, (node << 1) + 1);
	
	H[node] = maxim (H[node << 1], H[(node << 1) + 1]);
}

inline int query (int i, int j, int node, int st, int dr){
	if (i <= st && dr <= j) return H[node];
	
	int m = (st + dr) >> 1;
	int sol = 0x3f3f3f3f;
	
	if (i <= m)
		sol = maxim (sol, query (i, j, node << 1, st, m));
	if (j > m)
		sol = maxim (sol, query (i, j, (node << 1) + 1, m + 1, dr));
	
	return sol;
}

int i, Q, st, dr;
int main (){
	freopen ("rmq.in", "r", stdin);
	freopen ("rmq.out", "w", stdout);
	
	scanf ("%d%d", &n, &m);
	
	for (i = 1; i <= n; ++i){
		scanf ("%d", &v[i]);
		
		update2 (1, n, i, v[i], 1);
	}
	
	for (; m > 0; --m){
		scanf ("%d%d", &st, &dr);
		printf ("%d\n", query (st, dr, 1, 1, n));
	}
	return 0;
}