include [HTML_REMOVED]
using namespace std;
const int N = 200010;
struct Node
{
int l,r,maxv1,maxv2;
int cnt1,cnt2;
}tr[N*10];
struct xxyy
{
int first,second,cnt1,cnt2;
};
int a[N];
int hh[N];
void pushup(int u)
{
tr[u]={tr[u].l,tr[u].r,0,0,0,0};
int maxv11=tr[u<<1].maxv1,maxv12=tr[u<<1].maxv2;
int maxv21=tr[u<<1|1].maxv1,maxv22=tr[u<<1|1].maxv2;
hh[1]=maxv11,hh[2]=maxv12,hh[3]=maxv21,hh[4]=maxv22;
sort(hh+1,hh+4+1);
int len=unique(hh+1,hh+4+1)-(hh+1);
if(hh[len]==tr[u<<1].maxv1)
{
tr[u].cnt1+=tr[u<<1].cnt1;
}
if(hh[len]==tr[u<<1|1].maxv1)
{
tr[u].cnt1+=tr[u<<1|1].cnt1;
}
if(hh[len]==tr[u<<1].maxv2)
{
tr[u].cnt1+=tr[u<<1].cnt2;
}
if(hh[len]==tr[u<<1|1].maxv2)
{
tr[u].cnt1+=tr[u<<1|1].cnt2;
}
if(hh[len-1]==tr[u<<1].maxv1)
{
tr[u].cnt2+=tr[u<<1].cnt1;
}
if(hh[len-1]==tr[u<<1].maxv2)
{
tr[u].cnt2+=tr[u<<1].cnt2;
}
if(hh[len-1]==tr[u<<1|1].maxv1)
{
tr[u].cnt2+=tr[u<<1|1].cnt1;
}
if(hh[len-1]==tr[u<<1|1].maxv2)
{
tr[u].cnt2+=tr[u<<1|1].cnt2;
}
tr[u].maxv1=hh[len];
tr[u].maxv2=hh[len-1];
//cout<<tr[u].l<<’ ‘<<tr[u].r<<’ ‘<<tr[u].maxv1<<’ ‘<<tr[u].maxv2<<’ ‘<<tr[u].cnt1<<’ ‘<<tr[u].cnt2<<endl;
}
void build(int u,int l,int r)
{
if(l==r)
{
tr[u]={l,r,a[l],0,1,0};
}
else
{
tr[u]={l,r,0,0,0,0};
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modify(int u,int x,int v)
{
if(tr[u].l==x&&tr[u].r==x)
{
tr[u]={x,x,v,0,1,0};
}
else
{
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid)
{
modify(u<<1,x,v);
}
else
{
modify(u<<1|1,x,v);
}
pushup(u);
}
}
xxyy query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r)
{
xxyy ans={tr[u].maxv1,tr[u].maxv2,tr[u].cnt1,tr[u].cnt2};
return ans;
}
else
{
xxyy ans={0,0,0,0};
int mid=tr[u].l+tr[u].r>>1;
xxyy ans1={0,0,0,0},ans2{0,0,0,0};
if(l<=mid)
{
ans1=query(u<<1,l,r);
}
if(r>mid)
{
ans2=query(u<<1|1,l,r);
}
hh[1]=ans1.first,hh[2]=ans1.second;
hh[3]=ans2.first,hh[4]=ans2.second;
sort(hh+1,hh+4+1);
int len=unique(hh+1,hh+4+1)-(hh+1);
int xx=0,yy=0;
if(hh[len]==ans1.first)
{
xx+=ans1.cnt1;
}
if(hh[len]==ans1.second)
{
xx+=ans1.cnt2;
}
if(hh[len]==ans2.first)
{
xx+=ans2.cnt1;
}
if(hh[len]==ans2.second)
{
xx+=ans2.cnt2;
}
if(hh[len-1]==ans1.first)
{
yy+=ans1.cnt1;
}
if(hh[len-1]==ans1.second)
{
yy+=ans1.cnt2;
}
if(hh[len-1]==ans2.first)
{
yy+=ans2.cnt1;
}
if(hh[len-1]==ans2.second)
{
yy+=ans2.cnt2;
}
ans={hh[len],hh[len-1],xx,yy};
return ans;
}
}
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
while (m – )
{
int k,p,x;
cin>>k>>p>>x;
if(k==1)
{
modify(1,p,x);
}
else
{
xxyy ans=query(1,p,x);
//cout<<ans.first<<’ ‘<<ans.second<<’ ‘<<ans.cnt1<<’ ‘<<ans.cnt2<<endl;
cout<<ans.cnt2<<endl;
}
}
}