#include <iostream>
#include <algorithm>
#include <fstream>
#define NN 100000
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m, v[NN + 1], A[4 * NN + 100];
void Init(int k, int st, int dr){
if(st == dr)
A[k] = v[st];
else
{
int m = (st + dr) / 2;
Init(2 * k, st , m);
Init(2 * k + 1 , m + 1, dr);
A[k] = max(A[2 * k] , A[2 * k + 1]);
}
}
void Update(int i, int x, int k, int st, int dr){
if(st == dr)
A[k] = x;
else
{
int m = (st + dr) / 2;
if(i <= m)
Update(i, x, 2 * k , st , m);
else
Update(i, x, 2 * k + 1, m + 1, dr);
A[k] = max(A[2 * k], A[2 * k + 1]);
}
}
int Query(int i, int j, int k, int st, int dr){
if(i == st && j == dr)
return A[k];
int m = (st + dr) / 2;
if(j <= m)
return Query(i, j, 2 * k, st , m);
if(i > m)
return Query(i, j, 2 * k + 1, m + 1, dr);
return max(Query(i, m, 2 * k, st, m), Query(m + 1, j, 2 * k + 1, m + 1, dr));
}
int main(){
fin >> n >> m;
for(int i = 1 ; i <= n ; i ++)
fin >> v[i];
Init(1 , 1, n);
for( ; m ; m --)
{
int op, x, y;
fin >> op >> x >> y;
if(op == 1){
v[x] = y;
Update(x,y,1,1,n);
}
else
fout << Query(x,y,1,1,n) << "\n";
}
}