Cod sursa(job #808657)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 7 noiembrie 2012 06:01:15
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <algorithm>

using namespace std;

inline int next_int() {
	int d;
	scanf("%d", &d);
	return d;
}

struct Segment {
	int value;
	Segment() :
		value(0) {
	}
	Segment(int v) :
		value(v) {
	}
	Segment operator+(const Segment&a) {
		return Segment(max(value, a.value));
	}
};

template<typename T>
struct SegmentTree {
	int H;
	T *Tree;
	SegmentTree(int h) {
		H = h;
		Tree = new T[2 << H];
	}
	T q(int root, int left, int right, int a, int b) {
		if (left == a && b == right)
			return Tree[root];
		int mid = (left + right) / 2;
		if (b <= mid)
			return q(root * 2, left, mid, a, b);
		if (mid <= a)
			return q(root * 2 + 1, mid, right, a, b);
		return q(root * 2, left, mid, a, mid) + q(root * 2 + 1, mid, right, mid, b);
	}
	T query(int a, int b) {
		return q(1, 1 << H, 2 << H, (1 << H) + a, (1 << H) + b);
	}
	void set(int index, T value) {
		index += 1 << H;
		Tree[index] = value;
		while (index >= 2) {
			index /= 2;
			Tree[index] = Tree[index * 2] + Tree[index * 2 + 1];
		}
	}
};

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int n = next_int();
	int m = next_int();
	SegmentTree<Segment> st(17);
	for (int i = 0; i < n; i++) {
		st.set(i, next_int());
	}
	for (int i = 0; i < m; i++) {
		int a = next_int();
		int b = next_int();
		int c = next_int();
		if (a == 0) {
			printf("%d\n", st.query(b - 1, c).value);
		}
		if (a == 1) {
			st.set(b - 1, c);
		}
	}
	return 0;
}