#include <iostream>
#include <fstream>
#include <limits.h>
#define minn INT_MIN
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n ,m, poz, qst, qdr, st, dr, Arbore[400066], V[100001],op,a,b;
void Citire()
{ int i;
f>>n>>m;
for(i=0;i<n;i++)
f>>V[i];
}
void Constructie(int st, int dr, int poz)
{ if(st==dr)
Arbore[poz]=V[st];
else { int m=(st+dr)/2;
Constructie(st,m,2*poz+1);
Constructie(m+1,dr,2*poz+2);
Arbore[poz]=max(Arbore[poz*2+1],Arbore[poz*2+2]);
}
}
int Interogare(int qst, int qdr, int st, int dr, int poz)
{ if(qst<=st&&dr<=qdr)
return Arbore[poz];
if((qdr<st)||(dr<qst))
return minn;
int m=(st+dr)/2;
return max(Interogare(qst,qdr,st,m,2*poz+1),Interogare(qst,qdr,m+1,dr,2*poz+2));
}
void Actualizare(int qst, int qdr, int st, int dr, int poz,int x)
{
if(st==qst&&dr==qdr)
Arbore[poz]=x;
else { int m=(st+dr)/2;
if(qst<=m)
Actualizare(qst,qdr,st,m,2*poz+1,x);
if(m<qdr)
Actualizare(qst,qdr,m+1,dr,2*poz+2,x);
Arbore[poz]=max(Arbore[poz*2+1],Arbore[poz*2+2]);
}
}
int main()
{ int i;
Citire();
Constructie(0,n-1,0);
for(i=1;i<=m;i++)
{f>>op>>a>>b;
if(op==0)
{ g<<Interogare(a-1,b-1,0,n-1,0)<<endl;
}
else { Actualizare(a-1,a-1,0,n-1,0,b);
}
}
f.close();
g.close();
return 0;
}