#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbin.out");
int N,M,i,x,op,y,max1;
long long arbint[400001];
void update(int nod, int left, int right , int poz , int val)
{ if(left==right)
{ arbint[nod]=val;
return;
}
int mid=(left+right)/2;
if(poz<=mid)
update(2*nod,left,mid,poz,val);
else
update(2*nod+1,mid+1,right,poz,val);
arbint[nod]=max(arbint[2*nod],arbint[2*nod+1]);
}
void query(int nod, int left, int right)
{ if(x<=left && right<=y)
{ if(max1<arbint[nod])
{ max1=arbint[nod];
return;
}
}
else
{ int mid=(left+right)/2;
if(x<=mid)
query(nod*2,left,mid);
else
query(nod*2+1,mid+1,right);
}
}
int main()
{ f>>N>>M;
for(i=1;i<=N;i++)
{ f>>x;
update(1,1,N,i,x);
}
for(i=1;i<=M;i++)
{ f>>op>>x>>y;
if(op==0)
{ max1=-1;
query(1,1,N);
g<<max1<<'\n';
}
else
update(1,1,N,x,y);
}
f.close();
g.close();
return 0;
}