//Ilie Dumitru
#include<cstdio>
int v[400100];
int pos, val;
int p1, p2;
inline int max(int a, int b)
{
return a+(b-a)*(b>a);
}
void updt(int nod, int st, int dr)
{
if(st==dr)
v[nod]=val;
else
{
int mid=(st+dr)>>1;
if(pos<=mid)
updt(nod<<1, st, mid);
else
updt((nod<<1)+1, mid+1, dr);
v[nod]=max(v[nod<<1], v[(nod<<1)+1]);
}
}
void query(int nod, int st, int dr)
{
if(p1<=st && dr<=p2)
{
if(val<v[nod])
val=v[nod];
}
else
{
int mid=(st+dr)>>1;
if(p1<=mid)
query(nod<<1, st, mid);
if(p2>mid)
query((nod<<1)+1, mid+1, dr);
}
}
int main()
{
FILE *f=fopen("arbint.in", "r"), *g=fopen("arbint.out", "w");
int N, M, i, x, a, b;
fscanf(f, "%i", &N);
fscanf(f, "%i", &M);
for(pos=1;pos<=N;++pos)
{
fscanf(f, "%i", &val);
updt(1, 1, N);
}
for(i=0;i<M;++i)
{
fscanf(f, "%i", &x);
fscanf(f, "%i", &a);
fscanf(f, "%i", &b);
if(x)
{
val=b;
pos=a;
updt(1, 1, N);
}
else
{
val=-1;
p1=a;
p2=b;
query(1, 1, N);
fprintf(g, "%i\n", val);
}
}
fclose(f);
fclose(g);
return 0;
}