#include <fstream>
#define MaxN 100001
#define max(a, b) (a>b?a:b)
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int V[4*MaxN];
int Size;
int At(int i){
return V[i];
}
void Redo(int val, int target, int left, int right, int present){
int mid=(left+right)/2;
if(left>target || right<target) return;
if(left==right) {V[present]=val; return;}
else if(target<=mid) Redo(val, target, left, mid, 2*present);
else Redo(val, target, mid+1, right, 2*present+1);
V[present]=max(V[2*present], V[2*present+1]);
return;
}
int Find(int left, int right, int a, int b, int present){
int mid=(a+b)/2;
if(a==left && b==right) return V[present];
if(left<=mid && right<=mid) return Find(left, right, a, mid, 2*present);
if(left<=mid && right>mid) return max(Find(left, mid, a, mid, 2*present), Find(mid+1, right, mid+1, b, 2*present+1));
if(left>mid && right>mid) return Find(left, right, mid+1, b, 2*present+1);
return 0;
}
int N, i, M;
int main()
{
fin>>N>>M;
Size=N;
for(i=1; i<=N; ++i){
int x;
fin>>x;
Redo(x, i, 1, N, 1);
}
for(i=1; i<=M; ++i){
int c, a, b;
fin>>c>>a>>b;
if(c==0) fout<<Find(a, b, 1, N, 1)<<"\n";
else Redo(b, a, 1, N, 1);
}
return 0;
}