Cod sursa(job #1456223)

Utilizator aimrdlAndrei mrdl aimrdl Data 30 iunie 2015 03:31:53
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

#define MAX(a, b) ((a) > (b)) ? (a) : (b)

long v[200005];

void update (int l, int r, int pos, int x, int i) {
	if (pos <= l && pos >= r) {
		v[i] = x;
		return;
	} else {
		int mid = (l + r) / 2;
		if (pos <= mid) update(l, mid, pos, x, 2*i);
		if (pos > mid) update(mid+1, r, pos, x, 2*i+1);
		v[i] = MAX(v[2*i], v[2*i+1]);
	}
}

long query (int l, int r, int a, int b, int i) {
	if (a <= l && b >= r) {
		return v[i];
	} else {
		int mid = (l + r) / 2;
		long m1 = 0, m2 = 0;
	
		if (a <= mid) m1 = query(l, mid, a, b, 2*i);
		if (b > mid) m2 = query(mid+1, r, a, b, 2*i+1);
		
		return MAX(m1, m2);
	}
} 

int main (void) {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	
	int m, n;
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; ++i) {
		int x;
		scanf("%d", &x);
		
		update(1, n, i, x, 1);
	}
	
	/*for (int i = 1; i <= 2*n; ++i) {
		printf("%ld ", v[i]);
	}
	printf("\n");
	*/	
	for (int i = 0; i < m; ++i) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		
		if (a) {
			update(1, n, b, c, 1);
		} else {
			long r = query(1, n, b, c, 1);
			printf("%ld\n", r);
		}
	}
	
	return 0;
}