/*
Look at me!
Look at me!
Look at how large the monster inside me has become!
*/
#include<fstream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int >::iterator a=b.begin();a!=b.end();a++)
#define FITP(a,b) for(vector<pair<int,int> >::iterator a=b.begin();a!=b.end();a++)
#define RIT(a,b) for(vector<int>::reverse_iterator a=b.end();a!=b.begin();++a)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#define f cin
#define g cout
#include<queue>
#define INF 0x3f3f3f3f
#define debug cerr<<"OK";
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define eps 1.e-9
#define BUFMAX 10100100
#define N 100100
#define BM 100100
#define mod 1000000007
#define inf (1<<30)
using namespace std;
/*int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};*/
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,l,r,p,x,t,m;
struct Tr
{
Tr *l,*r;
int val,ma,cnt,pr;
Tr(int _cnt,int _val)
{
val=ma=_val;
cnt=_cnt;
pr=rand();
l=r=NULL;
}
};
#define T Tr*
T R;
int cnt(T t)
{
if(!t)
return 0;
return t->cnt;
}
int ma(T t)
{
if(!t)
return 0;
return t->ma;
}
void upd(T &t)
{
if(!t)
return ;
t->cnt=1+cnt(t->l)+cnt(t->r);
t->ma=max(ma(t->l),ma(t->r));
t->ma=max(t->val,t->ma);
}
void merge(T &t,T l,T r)
{
if(!l||!r)
{
t=l?l:r;
upd(t);
return ;
}
if(l->pr<r->pr)
merge(l->r,l->r,r),t=l;
else
merge(r->l,l,r->l),t=r;
upd(t);
}
void split(T t,T &l,T &r,int k,int cur)
{
if(!t)
return void(l=r=t);
int ck=cur+cnt(t->l)+1;
if(k<=ck)
split(t->l,l,t->l,k,cur),r=t;
else
split(t->r,t->r,r,k,ck),l=t;
upd(t);
}
void insert(T &t,T it,int cur)
{
if(!t)
{
t=it;
upd(t);
return ;
}
int ck=cur+cnt(t->l)+1;
if(it->pr>t->pr)
split(t,it->l,it->r,it->cnt,cur),t=it;
else
if(it->cnt<=ck)
insert(t->l,it,cur);
else
insert(t->r,it,ck);
upd(t);
}
void erase(T &t,int k,int cur)
{
if(!t)
return ;
int ck=cur+cnt(t->l)+1;
if(ck==k)
merge(t,t->l,t->r);
else
if(k<ck)
erase(t->l,k,cur);
else
erase(t->r,k,ck);
upd(t);
}
int qry(int l,int r)
{
Tr *t1,*t2;
split(R,R,t1,l,0);
split(t1,t1,t2,r-l+2,0);
int sol=ma(t1);
merge(t1,t1,t2);
merge(R,R,t1);
return sol;
}
int main ()
{
f>>n>>m;
FOR(i,1,n)
{
f>>x;
T it=new Tr(i,x);
insert(R,it,0);
}
FOR(i,1,m)
{
f>>t;
if(!t)
{
f>>l>>r;
g<<qry(l,r)<<"\n";
}
else
{
f>>p>>x;
erase(R,p,0);
T it=new Tr(p,x);
insert(R,it,0);
}
}
return 0;
}