#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int a[NMAX<<2];
void build (int node, int st, int dr) {
if (st == dr) {
fin >> a[node];
}
else {
int mid = (st + dr) >> 1;
build(node*2,st,mid);
build(node*2+1,mid+1,dr);
a[node] = max(a[node*2],a[node*2+1]);
}
}
int query (int node, int st, int dr, int x, int y) {
if (x <= st && dr <= y) {
return a[node];
}
else {
int mid = (st + dr) >> 1;
if (y <= mid) {
return query(node*2,st,mid,x,y);
}
else
if (x > mid) {
return query(node*2+1,mid+1,dr,x,y);
}
else {
return max(query(node*2,st,mid,x,y),query(node*2+1,mid+1,dr,x,y));
}
}
}
void update (int node, int st, int dr, int poz, int val) {
if (st == dr) {
a[node] = val;
}
else {
int mid = (st + dr) >> 1;
if (poz <= mid) {
update(node*2,st,mid,poz,val);
}
else {
update(node*2+1,mid+1,dr,poz,val);
}
a[node] = max(a[node*2],a[node*2+1]);
}
}
int main () {
int n, m;
fin >> n >> m;
build(1,1,n);
int op, x, y;
//cout << n << m;
for (int t = 1; t <= m; ++t) {
fin >> op >> x >> y;
if (op == 0) {
fout << query(1,1,n,x,y) << '\n';
}
else {
update(1,1,n,x,y);
}
}
return 0;
}