#define inf 0x3f3f3f3f
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100001], n, q;
int a[400001];
int poz[100001];
void read()
{
fin >> n >> q;
for(int i=1; i<=n; i++)
fin >> v[i];
}
void create(int st, int dr, int nod)
{
if(st==dr)
{
a[nod]=v[st];
poz[st]=nod;
return;
}
int mid=(st+dr)/2;
create(st, mid, 2*nod), create(mid+1, dr, 2*nod+1);
a[nod]=max(a[2*nod], a[2*nod+1]);
}
void update(int nod, int val)
{
while(nod)
a[nod]=max(a[2*nod], a[2*nod+1]), nod/=2;
}
int rmq(int st, int dr, int x, int y, int nod)
{
if(dr<x || st>y)
return 0;
if(x<=st && y>=dr)
return a[nod];
int mid=(st+dr)/2;
return max(rmq(st, mid, x, y, 2*nod), rmq(mid+1, dr, x, y, 2*nod+1));
}
int main()
{
read();
create(1, n, 1);
for(int i=1, cer, x, y; i<=q; ++i)
{
fin >> cer >> x >> y;
if(cer==0)
fout << rmq(1, n, x, y, 1) << "\n";
else
a[poz[x]]=y, update(poz[x]/2, y);
}
return 0;
}