Cod sursa(job #681892)

Utilizator aloneForever Alone alone Data 18 februarie 2012 00:07:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define NMAX 100050

#define ns (nod << 1)
#define nd (nod << 1) + 1
#define mij ((st + dr) >> 1)

int A[4 * NMAX], N, M, i, x, t, a, b;

int query (int, int, int, int, int);
void update (int, int, int, int, int);

int main () {
	
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	
	scanf ("%d %d", &N, &M);
	for (i = 1; i <= N; i++) {
		scanf ("%d", &x);
		update (1, 1, N, i, x);
	}
	
	for (i = 1; i <= M; i++) {
		scanf ("%d %d %d", &t, &a, &b);
		if (t == 0) printf ("%d\n", query (1, 1, N, a, b));
		if (t == 1) update (1, 1, N, a, b);
	}
	
	return 0;
}

void update (int nod, int st, int dr, int pos, int val) {
	
	if (st == dr && st == pos) {
		A[nod] = val;
		return;
	}
	
	if (pos <= mij) update (ns, st, mij, pos, val);
	if (mij < pos) update (nd, mij + 1, dr, pos, val);
	
	A[nod] = max (A[ns], A[nd]);
}

int query (int nod, int st, int dr, int a, int b) {
	
	if (a <= st && dr <= b) return A[nod];
	
	int x = 0, y = 0;
	if (a <= mij) x = query (ns, st, mij, a, b);
	if (mij < b) y = query (nd, mij + 1, dr, a, b);
	
	return max (x, y);
}