#include <iostream>
#include <fstream>
using namespace std;
#define maxn 100100
int n, m;
int a[maxn], v[2*maxn];
void init(int pos, int st, int dr)
{
if (dr <= st) v[pos] = a[dr];
else {
init(2*pos, st, (dr+st)/2);
init(2*pos + 1, (dr+st)/2+1, dr);
v[pos] = max(v[2*pos], v[2*pos+1]);
}
}
void update(int pos, int st, int dr, int x)
{
if (st >= dr) {
v[pos] = a[x];
} else {
if (x > (dr+st)/2) {
update(2*pos+1,(dr+st)/2+1, dr, x);
} else {
update(2*pos, st,(dr+st)/2, x);
}
v[pos] = max(v[2*pos], v[2*pos+1]);
}
}
int query(int pos, int st, int dr, int b, int c)
{
if (c < st || b > dr) return 0;
if (b <= st && c >= dr) return v[pos];
return max(query(2*pos, st, (dr+st)/2, b, c), query(2*pos+1, (dr+st)/2+1, dr, b, c));
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for (int i = 1; i <= n; i++)
{
f>>a[i];
}
init(1,1,n);
int op, b, c;
for (int i = 1; i <= m; i++)
{
f>>op>>b>>c;
if (op == 0) {
g<<query(1,1,n,b,c)<<'\n';
} else {
a[b] = c;
update(1, 1, n, b);
}
}
}