#include <fstream>
#include <vector>
#include <string>
#include <stack>
#include <cctype>
#include <sstream>
#include <limits>
#define pb push_back
using namespace std;
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
struct node
{
// relevant data
};
const int MAX_N = 100003;
int v[4*MAX_N+10]{-1};
int N;
void Update(int n, int st, int dr, int a, int b,int val)
{
if(a <=st && dr <= b)
v[n] = val;
else
{
int mij = (st+dr)/2;
if( a<= mij)
Update(2*n,st,mij,a,b,val);
if( b> mij)
Update(2*n+1,mij+1,dr,a,b,val);
v[n] = max(v[2*n],v[2*n+1]);
}
}
int Query(int n, int st, int dr, int a, int b)
{
if(a <=st && dr <= b)
return v[n];
else
{
int mij = (st+dr)/2,left = 0, right = 0;
if( a<= mij)
left = Query(2*n,st,mij,a,b);
if( b> mij)
right = Query(2*n+1,mij+1,dr,a,b);
return std::max(left,right);
}
}
int main()
{
int M,val,op,a,b;
in >> N >> M;
for(int i = 1 ; i <= N ; i++)
{
in >> val;
Update(1,1,N,i,i,val);
}
for(int i = 0 ; i < M ;i++)
{
in >> op >> a >> b;
if(op == 0)
out<<Query(1,1,N,a,b)<<'\n';
else
Update(1,1,N,a,a,b);
}
return 0;
}