Cod sursa(job #1769638)

Utilizator danalex97Dan H Alexandru danalex97 Data 2 octombrie 2016 21:41:25
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
using namespace std;

template <class T>
class Aint {
public:
	Aint(const int size, T (* f)(T, T)) : size(size), f(f) {
		array = new T [size * 3];
	}

	~Aint() {
		delete[] array;
	}

	T query(const int l, const int r) {
		li = l;
		ri = r;
		return query(1, 1, size);
	}

	void update(const int p, const T v) {
		this->p = p;
		value = v;
		update(1, 1, size);
	}
private:
	T query(const int n, const int l, const int r) {	
		if (li <= l && r <= ri) {
			return array[n];
		}

		const int m = (l + r) / 2;
		if (li > m) {
			return query(2 * n + 1, m + 1, r); 
		}
		if (ri <= m) {
			return query(2 * n, l, m); 
		}
		return f(query(2 * n, l, m), query(2 * n + 1, m + 1, r));
	}

	void update(int n, int l, int r) {
		if (p < l || p > r) {
			return;
		}

		if (l == r) {
			array[n] = value;
			return;
		}		

		const int m = (l + r) / 2;
		update(n * 2, l, m);
		update(n * 2 + 1, m + 1, r);

		array[n] = f(array[n * 2], array[n * 2 + 1]);
	}

	int li, ri, p;
	const int size;

	T *array, value;
	T (* f)(T, T);
};

static int max(int x, int y) {
	return x > y ? x : y;
}

int n, m; 

ifstream F("arbint.in");
ofstream G("arbint.out");

int main() {
	F >> n >> m;
	Aint<int> *aint = new Aint<int>(n, &max);

	for (int i = 1, x; i <= n; ++i) {
		F >> x;
		aint->update(i, x);
	}

	for (int i = 1, t, x, y; i <= m; ++i) {
		F >> t >> x >> y;

		if (t) {
			aint->update(x, y);
		} else {
			G << aint->query(x, y) << '\n';
		}
	}

	delete aint;
}