import java.io.*;
import java.util.Scanner;
public class Main {
static final int NMAX = 100002;
static int []a = new int[NMAX];
public static class SegmentTree
{
private static int []aint = new int[4*NMAX];
public static void Build(int node,int Left,int Right)
{
if(Left == Right)
{
aint[node] = a[Left];
return;
}
int mid = (Left+Right)/2;
Build(2*node,Left,mid);
Build(2*node+1,mid+1,Right);
aint[node] = (aint[2*node]>=aint[2*node+1]?aint[2*node]:aint[2*node+1]);
}
public static void Update(int node,int Left,int Right,int pos,int val)
{
if(Left == Right)
{
aint[node] = val;
return;
}
int mid = (Left+Right)/2;
if(pos <= mid)
Update(2*node,Left,mid,pos,val);
else
Update(2*node+1,mid+1,Right,pos,val);
aint[node] = (aint[2*node]>=aint[2*node+1]?aint[2*node]:aint[2*node+1]);
}
public static int Query(int node,int Left,int Right,int A,int B)
{
if(A <= Left && Right <= B)
return aint[node];
int mid = (Left+Right)/2,x = 0, y = 0;
if(A <= mid)
x = Query(2*node,Left,mid,A,B);
if(mid < B)
y = Query(2*node+1,mid+1,Right,A,B);
return (x >= y? x : y );
}
}
static SegmentTree T;
public static void main(String []args) throws IOException
{
Scanner in = new Scanner(new FileInputStream("arbint.in"));
PrintWriter out = new PrintWriter("arbint.out");
int n = in.nextInt(), operation, x, y;
int m = in.nextInt();
for(int i=1;i<=n;++i)
a[i] = in.nextInt();
T.Build(1,1,n);
while(m-- > 0)
{
operation = in.nextInt();
x = in.nextInt();
y = in.nextInt();
if(operation == 0)
out.print(String.valueOf(T.Query(1, 1, n, x, y))+"\n");
else
T.Update(1, 1, n, x, y);
}
in.close();
out.close();
}
}