Cod sursa(job #1456224)

Utilizator aimrdlAndrei mrdl aimrdl Data 30 iunie 2015 03:41:04
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;

#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) {
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	
	int m, n;
	in >> n >> m;
	
	for (int i = 1; i <= n; ++i) {
		int x;
		in >> 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;
		in >> a >> b >> c;
		
		if (a) {
			update(1, n, b, c, 1);
		} else {
			long r = query(1, n, b, c, 1);
			out << r << "\n";
		}
	}
	
	in.close();
	out.close();
	return 0;
}