#include <iostream>
#include<bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX=100005;
int Father[NMAX], Arbore[4*NMAX], n, m, R;
void build(int nod, int st, int dr)
{
if(st==dr)
in>>Arbore[nod];
else
{
int mid=(st+dr)/2;
build(nod*2, st, mid);
build(nod*2+1, mid+1, dr);
Arbore[nod]=max(Arbore[2*nod], Arbore[nod*2+1]);
}
}
void update(int nod, int st, int dr, int x, int y)
{
if(st==dr)
Arbore[nod]=y;
else
{
int mid=(st+dr)/2;
if(x<=mid)
update(nod*2, st, mid, x, y);
if(mid+1<=y)
update(nod*2+1, mid+1, dr, x, y);
Arbore[nod]=max(Arbore[2*nod], Arbore[2*nod+1]);
}
}
int query(int nod, int st, int dr, int x, int y)
{
if(st>=x && y>=dr)
{
R=max(R, Arbore[nod]);
}
else
{
int mid=(st+dr)/2;
if(x<=mid)
query(nod*2, st, mid, x, y);
else
query(nod*2+1, mid+1, dr, x, y);
}
}
int main()
{
in>>n>>m;
build(1, 1, n);
int p, x, y;
for(int i=1; i<=m; i++)
{
in>>p>>x>>y;
if(p)
update(1, 1, n, x, y);
else
query(1, 1, n, x, y), out<<R<<'\n', R=0;
}
return 0;
}