Pagini recente » Cod sursa (job #1043051) | Cod sursa (job #1270276) | Cod sursa (job #2219243) | Cod sursa (job #819053) | Cod sursa (job #2757187)
#include <fstream>
#include <limits>
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
const int N = 1 << 18;
int n, v[N + 1];
int g_val, g_poz;
void update_impl(int p = 1, int l = 1, int r = n) {
if (l == r) {
v[p] = g_val;
return;
}
int m = (l + r) / 2;
if (g_poz <= m) {
update_impl(2 * p, l, m);
} else {
update_impl(2 * p + 1, m + 1, r);
}
v[p] = std::max(v[2 * p], v[2 * p + 1]);
}
inline void update(int poz, int val) {
g_val = val, g_poz = poz;
update_impl();
}
int g_l, g_r;
int query_impl(int p = 1, int l = 1, int r = n) {
if (g_l <= l && g_r >= r) {
return v[p];
}
int m = (l + r) / 2;
int lres = std::numeric_limits<int>::min();
int rres = std::numeric_limits<int>::min();
if (g_l <= m) {
lres = query_impl(2 * p, l, m);
}
if (m < g_r) {
rres = query_impl(2 * p + 1, m + 1, r);
}
return std::max(lres, rres);
}
inline int query(int l, int r) {
g_l = l, g_r = r;
return query_impl();
}
int main() {
int q;
in >> n >> q;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
update(i, x);
}
for (int i = 0; i < q; ++i) {
int type;
in >> type;
if (type == 0) {
int a, b;
in >> a >> b;
out << query(a, b) << '\n';
} else {
int p, x;
in >> p >> x;
update(p, x);
}
}
}