#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
vector <int> aint;
void update(int nod, int l, int r, int poz, int val)
{
if(l == r) {aint[nod] = val; return;}
int m = (l+r)/2;
if(poz <= m) update(nod*2, l, m, poz, val);
else update(nod*2+1, m+1, r, poz, val);
aint[nod] = max(aint[nod*2], aint[nod*2+1]);
}
int query(int nod, int l, int r, int L, int R)
{
if(L<=l && r<=R) return aint[nod];
int m = (l+r)/2;
int m1 = (L <= m) ? query(nod*2, l, m, L, R) : 0;
int m2 = (m < R) ? query(nod*2+1, m+1, r, L, R) : 0;
return max(m1, m2);
}
int main()
{
int n, q; fin >> n >> q;
aint.assign(4*n + 10, 0);
for(int i=1; i<=n; i++)
{
int x; fin >> x;
update(1, 1, n, i, x);
}
for(int i=1; i<=q; i++)
{
int t, a, b; fin >> t >> a >> b;
if(t == 0) fout << query(1, 1, n, a, b) << '\n';
else update(1, 1, n, a, b);
}
return 0;
}