#include <cstdio>
#define MaxN 100001
#define max(a, b) (a>b?a:b)
using namespace std;
class Int{
private:
int V[MaxN];
public:
int Size;
int At(int i){
return V[i];
}
private:
void Redo(int val, int target, int left, int right, int present){
int mid=(left+right)/2;
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;
}
public:
void Change(int val, int target){
Redo(val, target, 1, Size, 1);
return;
}
int Get(int left, int right){
return Find(left, right, 1, Size, 1);
}
};
Int Arb;
int N, i, M;
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &N, &M);
Arb.Size=N;
for(i=1; i<=N; ++i){
int x;
scanf("%d", &x);
Arb.Change(x, i);
}
for(i=1; i<=M; ++i){
int c, a, b;
scanf("%d%d%d", &c, &a, &b);
if(c==0) printf("%d\n", Arb.Get(a, b));
else Arb.Change(b, a);
}
return 0;
}