Pagini recente » Cod sursa (job #1215163) | Cod sursa (job #2812776)
#include <bits/stdc++.h>
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
const int N = 1 << 18;
int n;
struct SegTree {
int v[N];
void update(int i, int x, int node = 1, int l = 1, int r = n) {
if (l == r) {
v[node] = x;
return;
}
int m = (l + r) / 2;
if (i <= m) {
update(i, x, 2 * node, l, m);
} else {
update(i, x, 2 * node + 1, m + 1, r);
}
v[node] = std::max(v[2 * node], v[2 * node + 1]);
}
int query(int ql, int qr, int node = 1, int l = 1, int r = n) {
if (ql <= l && r <= qr) {
return v[node];
}
int lres, rres;
lres = rres = std::numeric_limits<int>::min();
int m = (l + r) / 2;
if (ql <= m) {
lres = query(ql, qr, 2 * node, l, m);
}
if (qr > m) {
rres = query(ql, qr, 2 * node + 1, m + 1, r);
}
return std::max(lres, rres);
}
} tree;
enum Query {
Query,
Update
};
int main() {
int q;
in >> n >> q;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
tree.update(i, x);
}
while (q--) {
int query;
int a, b;
in >> query >> a >> b;
switch (query) {
case Query:
out << tree.query(a, b) << '\n';
break;
case Update:
tree.update(a, b);
break;
}
}
}