Pagini recente » Cod sursa (job #1492715) | Cod sursa (job #780230) | Cod sursa (job #2615361) | Cod sursa (job #2268266) | Cod sursa (job #2585975)
#include <fstream>
#include <array>
#include <functional>
#include <algorithm>
using std::max;
const int INF = 1 << 30;
constexpr int mylog2(int x) {
if (x <= 1) {
return x;
}
return 1 + mylog2(x >> 1);
}
template<int len>
class AINT {
std::array<int, (1<<(mylog2(len) - 2)) + 1> t;
public:
void update(int n, int poz, int val) {
std::function<void(int,int,int)> _update = [&](int p, int st, int dr) {
if (st == dr) {
t[p] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m) {
_update(2 * p, st, m);
} else {
_update(2 * p + 1, m + 1, dr);
}
t[p] = std::max(t[2 * p], t[2 * p + 1]);
};
_update(1, 1, n);
}
int query(int n, int a, int b) {
std::function<int(int, int, int)> _query = [&](int p, int st, int dr) {
if (a <= st && b >= dr) {
return t[p];
}
int m = (st + dr) / 2, maxst = -INF, maxdr = -INF;
if (a <= m) {
maxst = _query(2 * p, st, m);
}
if (b > m) {
maxdr = _query(2 * p + 1, m + 1, dr);
}
return max(maxst, maxdr);
};
return _query(1, 1, n);
}
};
AINT<100000> aint;
int main() {
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
fin >> x;
aint.update(n, i, x);
}
for (; m > 0; m--) {
int c, a, b;
fin >> c >> a >> b;
if (c == 0) {
fout << aint.query(n, a, b) << '\n';
} else {
aint.update(n, a, b);
}
}
return 0;
}