#include<bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX=100005;
int 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;
return;
}
int mid=(st+dr)/2;
if(x<=mid) update(nod*2, st, mid, x, y);
if(x>mid) 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);
if(mid+1<=y) 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==1) update(1, 1, n, x, y);
else query(1, 1, n, x, y), out<<R<<'\n', R=0;
}
return 0;
}