#include <bits/stdc++.h>
#define dbg(x) cerr<<#x": "<<x<<"\n"
#define dbg_p(x) cerr<<#x": "<<x.first<<","<<x.second<<"\n"
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"
#define st first
#define nd second
#define DMAX
#define NMAX
#define MMAX
using namespace std;
int n, k, x,m, v[100004], arb[400004], op, a, b;
string s;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void update(int nod, int pos, int val, int left, int right)
{
if(left == right) {
arb[nod] = val;
return;
}
int mid=(left+right)/2;
if (pos<=mid)
update(2*nod, pos, val, left,mid);
else update(2*nod+1, pos, val, mid+1, right);
arb[nod]=max(arb[2 * nod], arb[2 * nod + 1]);
}
int query(int nod, int a, int b, int left, int right)
{
if (left>=a&&right<=b)
return arb[nod];
int mid= (left+right)/2;
int ansl=000000000;
int ansr=000000000;
if (a<=mid)
ansl=query(2*nod, a, b, left, mid);
if (b>=mid+1)
ansr=query(2*nod+1, a, b, mid+1, right);
return max(ansl, ansr);
}
int main()
{
ios_base::sync_with_stdio(false);
fin>>n>>m;
for (int i=1;i<=n;i++)
fin>>v[i], update(1, i, v[i], 1, n);
for (int i=1;i<=m;i++)
{
fin>>op>>a>>b;
if (op==1)
update(1, a, b, 1, n);
else fout<<query(1, a, b, 1, n)<<'\n';
}
}