#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,q, v[NMAX], aint[4*NMAX],task,a,b,ans;
void build(int nod, int st, int dr)
{
if(st == dr)
{
aint[nod] = v[st];
return;
}
int mid = st + (dr - st) / 2;
build(nod << 1 , st , mid);
build(nod << 1 | 1, mid + 1 , dr);
aint[nod] = max(aint[nod << 1], aint[nod << 1 | 1]);
}
void update(int nod, int st, int dr, int poz, int val)
{
if(poz < st || poz > dr)
return;
if(st == dr && st == poz)
{
aint[nod] = val;
return;
}
int mid = st + (dr - st) / 2;
update(nod << 1, st , mid, poz, val);
update(nod << 1 | 1, mid + 1 , dr, poz, val);
aint[nod] = max(aint[nod << 1], aint[nod << 1 | 1]);
}
void query(int nod, int st, int dr, int left, int right)
{
if(left <= st && dr <= right)
{
ans = max(ans, aint[nod]);
return ;
}
int mid = st + (dr - st) / 2;
if(left <= mid)
query(nod << 1, st, mid, left, right) ;
if(right > mid)
query(nod << 1 | 1, mid + 1, dr, left, right);
}
int main()
{
f >> n >> q;
for(int i = 1; i <= n; ++i)
f >> v[i];
build(1,1,n);
for(int i = 1; i <= q; ++i)
{
f >> task >> a >> b;
if(task == 0)
{
ans = 0;
query(1,1,n,a,b);
g << ans << '\n';
}
else
update(1,1,n,a,b);
}
f.close(); g.close();
return 0;
}