#include <bits/stdc++.h>
#define nmax 100002
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,arr[nmax],sol,aint[nmax*4],op,x,y;
void build(int nod, int st, int dr) {
if (st==dr) {
aint[nod]=arr[st];
return;
}
int mid=(st+dr)/2;
build(2*nod,st,mid);
build(2*nod+1,mid+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void update(int nod, int st, int dr, int poz, int val) {
if (st==dr) {
aint[nod]=val;
return;
}
int mid=(st+dr)/2;
if (poz<=mid) update(2*nod,st,mid,poz,val);
if (poz>mid) update(2*nod+1,mid+1,dr,poz,val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void query(int nod, int st, int dr, int left, int right) {
if (left>dr || right<st) return;
if (left<=st && dr<=right) {
sol=max(sol,aint[nod]); return ;
}
int mid=(st+dr)/2;
query(2*nod,st,mid,left,right);
query(2*nod+1,mid+1,dr,left,right);
}
int main() {
f>>n>>m;
for (int i=1;i<=n;i++) f>>arr[i];
build(1,1,n);
for (int i=1;i<=m;i++) {
f>>op>>x>>y;
if (op==0) {
query(1,1,n,x,y);
g<<sol<<'\n';
sol=0;
}
else update(1,1,n,x,y);
}
}