Pagini recente » Cod sursa (job #3263199) | Cod sursa (job #2831281) | Cod sursa (job #2960256) | Cod sursa (job #2986154) | Cod sursa (job #808656)
Cod sursa(job #808656)
#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;
}