Pagini recente » Cod sursa (job #2738621) | Cod sursa (job #2075805) | Cod sursa (job #2164269) | Cod sursa (job #230073) | Cod sursa (job #2603058)
#include <cstdio>
#include <algorithm>
using namespace std;
const int OO = (int) 1e9;
struct Node {
Node *lft;
Node *rgh;
int l;
int r;
int store;
Node() {
lft = rgh = 0;
store = -OO;
l = r = 0;
}
};
void upd(Node *cur, int p, int x) {
if (cur->r < p || p < cur->l) {
return;
}
if (cur->l == cur->r) {
cur->store = x;
return;
}
if (!cur->lft) {
cur->lft = new Node;
cur->lft->l = cur->l;
cur->lft->r = (cur->l + cur->r) / 2;
}
if (!cur->rgh) {
cur->rgh = new Node;
cur->rgh->l = (cur->l + cur->r) / 2 + 1;
cur->rgh->r = cur->r;
}
upd(cur->lft, p, x);
upd(cur->rgh, p, x);
cur->store = max(cur->lft->store, cur->rgh->store);
}
int get(Node *cur, int l, int r) {
if (cur->r < l || r < cur->l) {
return -OO;
}
if (l <= cur->l && cur->r <= r) {
return cur->store;
}
if (!cur->lft) {
cur->lft = new Node;
cur->lft->l = cur->l;
cur->lft->r = (cur->l + cur->r) / 2;
}
if (!cur->rgh) {
cur->rgh = new Node;
cur->rgh->l = (cur->l + cur->r) / 2 + 1;
cur->rgh->r = cur->r;
}
return max(get(cur->lft, l, r), get(cur->rgh, l, r));
}
Node *root = new Node;
int main() {
freopen ("arbint.in", "r", stdin);
int n, q;
scanf("%d %d", &n, &q);
root->l = 1;
root->r = n;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
upd(root, i, x);
}
while (q--) {
int t, a, b;
scanf("%d %d %d", &t, &a, &b);
if (t == 0) {
printf("%d\n", get(root, a, b));
} else {
upd(root, a, b);
}
}
}