#include <fstream>
using namespace std;
const int nmax=4e5;
int lazy[nmax+3],aint[nmax+3],v[nmax/4+3],n;
void push_aint(int node) {
if(node<2*n&&lazy[node]!=-1) {
lazy[node*2]=lazy[node];
lazy[node*2+1]=lazy[node];
aint[node*2]=lazy[node];
aint[node*2+1]=lazy[node];
lazy[node]=-1;
}
}
void update_aint(int node,int st,int dr,int l,int r,int val) {
if(dr<st||st>r||dr<l)
return;
else if(st==l&&dr==r) {
aint[node]=val;
lazy[node]=val;
} else {
int mid=(st+dr)/2;
update_aint(node*2,st,mid,l,r,val);
update_aint(node*2+1,mid+1,dr,l,r,val);
aint[node]=max(aint[node*2],aint[node*2+1]);
}
}
int query_aint(int node,int st,int dr,int l,int r) {
if(dr<st||st>r||dr<l)
return 0;
if(st==l&&dr==r)
return aint[node];
if(st==dr)
return aint[node];
else {
push_aint(node);
int mid=(st+dr)/2;
return max(query_aint(node*2,st,mid,l,min(r,mid)),query_aint(node*2+1,mid+1,dr,max(l,mid+1),r));
}
}
void build_aint(int node, int st, int dr) {
if(st == dr) {
aint[node] = v[st];
} else {
int mid = (st + dr) / 2;
build_aint(node*2, st, mid);
build_aint(node*2+1, mid+1, dr);
aint[node] = max(aint[node*2],aint[node*2+1]);
lazy[node]=-1;
}
}
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int m,a,b,c;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>v[i];
}
build_aint(1,1,n);
//print();
for(int i=1; i<=m; i++) {
cin>>c>>a>>b;
if(c==0) {
cout<<query_aint(1,1,n,a,b)<<"\n";
} else {
update_aint(1,1,n,a,a,b);
//print();
}
}
return 0;
}