#include <stdio.h>
#include <assert.h>
struct node {
int val;
node *l, *r;
};
int N, M;
int MAX(int X, int Y) {
return X > Y ? X : Y;
}
void update(node* &u, int left, int right, int pos, int val) {
if (left == right) {
u -> val = val;
return;
}
if (u -> l == NULL) {
u -> l = new node;
u -> l -> val = 0;
}
if (u -> r == NULL) {
u -> r = new node;
u -> r -> val = 0;
}
int mid = (left + right) >> 1;
if (pos <= mid) {
update(u -> l, left, mid, pos, val);
} else {
update(u -> r, mid + 1, right, pos, val);
}
u -> val = MAX(u -> l -> val, u -> r -> val);
}
void query(node *u, int left, int right, int a, int b, int *max) {
if ((a <= left) && (right <= b)) {
*max = MAX(*max, u -> val);
return;
}
int mid = (left + right) >> 1;
if (a <= mid) {
query(u -> l, left, mid, a, b, max);
}
if (b > mid) {
query(u -> r, mid + 1, right, a, b, max);
}
}
int main(void) {
int i, val;
FILE *f = fopen("arbint.in", "r");
node *root = new node;
fscanf(f, "%d %d", &N, &M);
for (i = 1; i <= N; i++) {
fscanf(f, "%d", &val);
update(root, 1, N, i, val);
}
int task, a, b, max;
freopen("arbint.out", "w", stdout);
for (i = 1; i <= M; i++) {
fscanf(f, "%d %d %d", &task, &a, &b);
if (task == 0) {
max = 0;
query(root, 1, N, a, b, &max);
fprintf(stdout, "%d\n", max);
} else {
update(root, 1, N, a, b);
}
}
fclose(f);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}