#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct Aint
{
int v[200005];
void update(int node, int poz, int l, int r, int val)
{
if(l == r)
{
v[node] = val;
return;
}
int mij = (l + r)/2;
if(mij < poz)
update(2*node + 1, poz, mij + 1, r, val);
else
update(2*node, poz, l, mij, val);
v[node] = max(v[2*node],v[2*node + 1]);
}
int query(int node, int st, int dr, int l, int r)
{
if(dr < l || st > r)
return 0;
if(st >= l && dr <= r)
return v[node];
int mij = (st + dr) / 2;
if(r <= mij)
return query(2*node,st,mij,l,r);
else
if(l >= mij + 1)
return query(2*node + 1, mij + 1, dr,l,r);
return max(query(2*node,st,mij,l,mij),query(2*node + 1, mij + 1, dr, mij + 1, r));
}
}aint;
int main()
{
int n, m;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
fin >> x;
aint.update(1,i,1,n,x);
}
for(int i = 1; i <= m; i ++)
{
int t, x, y;
fin >> t >> x >> y;
if(t == 1)
aint.update(1,x,1,n,y);
else
fout << aint.query(1,1,n,x,y) << '\n';
}
return 0;
}