#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q, tip, a, b, v[100001], tree[200001];
void build(int nod, int left, int right) {
if(left == right) {
tree[nod] = v[left];
return;
}
int mid = (left + right) / 2;
build(2*nod, left, mid);
build(2*nod+1, mid+1, right);
tree[nod] = max(tree[2*nod], tree[2*nod+1]);
return;
}
void update(int nod, int left, int right, int pos, int val) {
if(left == right) {
tree[nod] = val;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
update(2*nod, left, mid, pos, val);
else update(2*nod+1, mid+1, right, pos, val);
tree[nod] = max(tree[2*nod], tree[2*nod+1]);
return;
}
int query(int nod, int left, int right, int x, int y) {
if(left >= x && right <= y)
return tree[nod];
int mid = (left + right) / 2, qst = 0, qdr = 0;
if(mid >= x)
qst = query(2*nod, left, mid, x, y);
if(mid < y)
qdr = query(2*nod+1, mid+1, right, x, y);
return max(qst, qdr);
}
int main()
{
fin >> n >> q;
for(int i=1; i<=n; i++)
fin >> v[i];
build(1, 1, n);
while(q--) {
fin >> tip >> a >> b;
if(tip) {
update(1, 1, n, a, b);
v[a] = b;
}
else
fout << query(1, 1, n, a, b) << '\n';
}
return 0;
}