#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int tree[400005],v[100005];
void constr(int st,int dr, int node)
{
if(st == dr)
{
tree[node] = v[st];
}
else
{
int mij = (st + dr)/2;
constr(st,mij,2* node);
constr(mij + 1,dr,2* node + 1);
tree[node] = max(tree[2*node],tree[2* node + 1]);
}
}
void update(int st,int dr,int node, int a, int b)
{
if(st == dr)
{
v[a] = b;
tree[node] = b;
}
else
{
int mij = (st + dr)/2;
if(a <= mij)
update(st,mij,2*node,a,b);
else
update(mij + 1,dr, 2* node + 1,a,b);
tree[node] = max(tree[2*node],tree[2*node + 1]);
}
}
int query(int st,int dr, int node,int a, int b)
{
if(st > b || dr < a)
return 0;
if(st >= a && dr <= b)
return tree[node];
int mij = (st + dr)/2;
int q1 =query(st, mij, 2 * node, a, b);
int q2 = query(mij + 1, dr, 2 * node + 1, a, b);
return max(q1,q2);
}
void read()
{
fin >> n >> m;
for(int i = 1; i <= n; ++i)
fin >> v[i];
constr(1,n,1);
for(int i = 0; i < m; ++i)
{
int t,a,b;
fin >> t >> a >> b;
if(t == 0)
fout << query(1,n,1,a,b) << "\n";
else
update(1,n,1,a,b);
}
}
int main()
{
read();
return 0;
}