#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int const nMax = 100005;
int x, y, n, k, op;
int aint[4*nMax];
void update(int st, int dr, int nod, int poz, int val){
if(st == dr){
aint[nod] = val;
return;
}
int mij = (st + dr)/2;
if( poz <= mij)
update(st, mij, nod*2, poz, val);
else
update(mij+1, dr, nod*2+1, poz, val);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
int query(int st, int dr, int l, int r, int nod){
if((l <= st && r >= dr) || st == dr){
return aint[nod];
}
int mij = (st+dr)/2;
int mxl = -1, mxr = -1;
if( l <= mij)
mxl = query(st, mij, l, r, nod*2);
if(r > mij)
mxr = query(mij+1, dr, l, r, nod*2+1);
return max(mxl, mxr);
}
int main()
{
fin >> n >> k;
for(int i = 1; i <= n; i++){
fin >> x;
update(1, n, 1, i, x);
}
for( int i = 1; i <= k; i++){
fin >> op >> x >> y;
if(op == 1)
update(1, n, 1, x, y);
else
fout << query(1, n, x, y, 1)<< "\n";
for(int i = 1; i <= 4*n; i++)
cout << aint[i] << " ";
cout << "\n";
}
/*for(int i = 1; i <= 4*n; i++)
cout << aint[i] << " ";*/
return 0;
}