#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N=100005;
class SegmentTree{
public:
SegmentTree(const int _n=0):
n(_n),
aint(vector<int>(5*_n, 0)){}
void update(const int poz, const int val)
{
X=poz;
Y=val;
Update(1, 1, n);
}
int query(const int st, const int dr)
{
X=st;
Y=dr;
ret=0;
Query(1, 1, n);
return ret;
}
private:
int n, X, Y, ret;
vector <int> aint;
void Update(int nod, int l, int r)
{
if(l==r)
{
aint[nod]=Y;
return;
}
int mid=(l+r)/2;
if(X<=mid) Update(2*nod, l, mid);
else Update(2*nod+1, mid+1, r);
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
void Query(int nod, int l, int r)
{
if(X<=l&&r<=Y)
{
ret=max(ret, aint[nod]);
return;
}
int mid=(l+r)/2;
if(X<=mid) Query(2*nod, l, mid);
if(Y>mid) Query(2*nod+1, mid+1, r);
}
};
SegmentTree a;
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, q, i, x, y;
scanf("%d%d", &n, &q);
a=SegmentTree(n);
for(i=1;i<=n;i++)
{
scanf("%d", &x);
a.update(i, x);
}
while(q--)
{
scanf("%d%d%d", &i, &x, &y);
if(i) a.update(x, y);
else printf("%d\n", a.query(x, y));
}
}