#include <fstream>
#include <vector>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
long long n,m,i,a,b,c;
struct adat
{
long long a,b,maxi;
};
vector<adat>f(525005);
long long fa(int a,int b, int e)
{
f[e].a=a;
f[e].b=b;
f[e].maxi=0;
if(a!=b)
{
fa(a,(a+b)/2,e*2);
fa((a+b)/2+1,b,e*2+1);
}
}
long long betesz(int i,int h, int p)
{
if(f[i].a==f[i].b && f[i].a==h)
{
f[i].maxi=p;
return p;
}
else
{
int k=0;
if(f[i*2].a<=h && f[i*2].b>=h) k=betesz(i*2,h,p);
else k=betesz(i*2+1,h,p);
if(k>f[i].maxi) f[i].maxi=k;
}
}
long long maxim(int bal, int jobb,int i)
{
if(f[i].a==bal && f[i].b==jobb) return f[i].maxi;
else
{
int k=0;
if(f[i*2].a<=bal && f[i*2].b>=jobb) k=maxim(bal,jobb,i*2);
else if(f[i*2+1].a<=bal && f[i*2+1].b>=jobb) k=maxim(bal,jobb,i*2+1);
else k=max(maxim(bal,f[i*2].b,i*2),maxim(f[i*2+1].a,jobb,i*2+1));
return k;
}
}
long long csere(int a,int b, int i)
{
if(f[i].a==f[i].b && f[i].a==a) f[i].maxi=b;
else
{
if(f[i*2].a<=a && f[i*2].b>=a) csere(a,b,i*2);
else csere(a,b,i*2+1);
f[i].maxi=max(f[i*2].maxi,f[i*2+1].maxi);
}
}
int main()
{
cin>>n>>m;
fa(1,n,1);
//for(auto e : f) cout<<e.a<<" "<<e.b<<"\n";
for(i=1;i<=n;i++)
{
cin>>a;
betesz(1,i,a);
}
//for(i=1;i<=9;i++) cout<<f[i].maxi<<"\n";
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
if(a==0) cout<<maxim(b,c,1)<<"\n";
else csere(b,c,1);
}
return 0;
}