Cod sursa(job #495492)

Utilizator Addy.Adrian Draghici Addy. Data 25 octombrie 2010 16:49:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define NMAX 100005

int A[4 * NMAX], tip, n, m, a, b, i, x;

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", &tip, &a, &b);
		
		if (tip == 0) printf ("%d\n", query (1, 1, n, a, b));
		if (tip == 1) update (1, 1, n, a, b);
	}
	
	return 0;
}

void update (int nod, int st, int dr, int poz, int x) {
	
	int mij = (st + dr) >> 1;
	
	if (st == dr) {
		A[nod] = x;
		return;
	}
	
	if (poz <= mij)
		update ((nod << 1), st, mij, poz, x);
	else
		update ((nod << 1) + 1, mij + 1, dr, poz, x);
	
	A[nod] = max (A[(nod << 1)], A[(nod << 1) + 1]);
}

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