#include <iostream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int v[400005];
void update(int node, int st, int dr, int val, int pos)
{
if(st == dr)
{
v[node]=val;
return;
}
int mid=(st+dr)/2;
if(pos <= mid)
{
update(node*2, st, mid, val, pos);
}
if(mid+1 <= pos)
{
update(node*2+1, mid+1, dr, val, pos);
}
v[node]=max(v[node*2], v[node*2+1]);
}
int query(int node, int st, int dr, int qleft, int qright)
{
int maxs=0;
if(qleft <= st && dr <= qright)
{
return v[node];
}
int mid=(st+dr)/2;
if(qleft <= mid)
{
maxs=max(maxs, query(node*2, st, mid, qleft, qright));
}
if(mid+1 <= qright)
{
maxs=max(maxs, query(node*2+1, mid+1, dr, qleft, qright));
}
return maxs;
}
int main()
{
int n, m;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
int a;
cin>>a;
update(1, 1, n, a, i);
}
for(int i=1; i<=m; i++)
{
int c, a, b;
cin>>c>>a>>b;
if(c == 0)
{
cout<<query(1, 1, n, a, b);
}
if(c == 1)
{
update(1, 1, n, b, a);
}
}
return 0;
}