#include <fstream>
#define NMAX 100005
using namespace std;
int aint[NMAX*10];
int v[NMAX];
int n,m;
void construct(int nod, int st, int dr) {
if (st > dr) return;
if (st == dr) {
aint[nod] = v[st];
return;
}
int mij = st + (dr - st) / 2;
construct(nod * 2, st, mij);
construct(nod * 2 + 1, mij + 1, dr);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
int M = 0;
void query(int nod, int l, int r, int st, int dr) {
if (st >= l && dr <= r) {
M = max(M, aint[nod]);
return;
}
if (st > r || dr < l || st > dr) return;
int mij = st + (dr - st) / 2;
query(nod * 2, l, r, st, mij);
query(nod * 2 + 1, l, r, mij + 1, dr);
}
void update(int nod, int st, int dr, int poz) {
if (st == dr) {
aint[nod] = v[st];
return;
}
if (st > dr) {
return;
}
int mij = st + (dr - st) / 2;
if (mij >= poz) update(nod * 2, st, mij, poz);
if (mij < poz) update(nod * 2 + 1, mij + 1, dr, poz);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int x, y, q;
cin>>n>>m;
for (int i = 1; i <= n; ++i){
cin>>v[i];
}
construct(1,1,n);
for (int i = 1; i <= m; ++i) {
cin>>q;
if (q == 0) {
cin >> x >> y;
M = 0;
query(1,x,y,1,n);
cout<< M << "\n";
}
else {
cin >> x >> y;
v[x] = y;
update(1, 1, n, x);
}
}
return 0;
}