#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define ll long long
class AINT{
vector<ll> v;
ll n;
void build(ll st, ll dr, ll p, vector<ll>& a)
{
if(st == dr)
{
v[p] = a[st];
return;
}
ll mid = (st + dr) >> 1;
build(st, mid, p<<1, a);
build(mid + 1, dr, p<<1|1, a);
v[p] = max(v[p << 1], v[p << 1 | 1]);
}
void set(ll st, ll dr, ll p, ll poz, ll val)
{
if(st == dr)
{
v[p] = val;
return;
}
ll mid = (st + dr) >> 1;
if(poz <= mid)
set(st, mid, p<<1, poz, val);
else
set(mid + 1, dr, p<<1|1, poz, val);
v[p] = max(v[p<<1], v[p<<1|1]);
}
ll query(ll st, ll dr, ll p, ll l, ll r)
{
if(st >= l && dr <= r)
return v[p];
if(st > r || dr < l)
return 0ll;
ll mid = (st + dr) >> 1;
return max(query(st, mid, p<<1, l, r), query(mid + 1, dr, p<<1|1, l, r));
}
public:
AINT(ll x)
{
n = x;
v.resize(n * 4 + 4);
}
void build(vector<ll>& a){build(1, n, 1, a);}
void set(ll poz, ll val){set(1, n, 1, poz, val);}
ll query(ll l, ll r){return query(1, n, 1, l, r);}
};
int main()
{
ll n, m;
fin>>n>>m;
vector<ll> a(n + 5);
for(int i = 1; i <= n; i++)
fin>>a[i];
AINT Alex(n);
Alex.build(a);
for(int i = 1; i <= m; i++)
{
char ch;
ll x, y;
fin>>ch>>x>>y;
if(ch == '1')
Alex.set(x, y);
else
fout<<Alex.query(x, y)<<'\n';
}
return 0;
}