#include <bits/stdc++.h>
#define r return
using namespace std;
int n,m,aint[400001];
int fs(int nod)
{
return 2*nod;
}
int fd(int nod)
{
return 2*nod + 1;
}
void up(int nod,int st, int dr, int poz, int x)
{
if(st == dr) {
aint[nod] = x;
r ;
}
int mij = (st + dr) / 2;
if(poz <= mij)
{
up(fs(nod), st, mij, poz, x);
}
else up(fd(nod), mij + 1, dr, poz, x);
aint[nod] = max(aint[fs(nod)],aint[fd(nod)]);
}
int query(int nod, int st, int dr, int qst, int qdr)
{
if(qst <= st && dr <= qdr)
{
r aint[nod];
}
if( dr < qst || qdr < st)
{
r INT_MIN;
}
int mij = ( st + dr ) / 2;
r max(query(fs(nod),st,mij,qst,qdr), query(fd(nod), mij + 1, dr, qst,qdr));
}
void cit()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
int pulea;
cin >> pulea;
up(1,1,n,i,pulea);
}
}
void rez(){
for(int i = 1; i <= m; i++)
{
int intrb,a,b;
cin >> intrb;
cin >> a >> b;
if(intrb == 1)
{
up( 1, 1, n, a, b);
continue ;
}
cout << query( 1, 1, n, a, b) << '\n';
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cit();
rez();
return 0;
}