#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define endl '\n'
#define itn int
#define pi pair<int,int>
using namespace std;
const int MOD1=1e9+7;
const int MOD2=998244353;
const int N=1e6+5;
struct Node{
int max1,max2,cnt1,cnt2;
}t[N<<2];
int n,q,op,pos,x,l,r,a[N];
void push_up(int p){
#define m1(p) t[p].max1
#define m2(p) t[p].max2
#define c1(p) t[p].cnt1
#define c2(p) t[p].cnt2
if(m1(p*2)<m1(p*2+1)){
m1(p)=m1(p*2+1),c1(p)=c1(p*2+1);
if(m1(p*2)<m2(p*2+1))
m2(p)=m2(p*2+1),c2(p)=c2(p*2+1);
if(m1(p*2)>m2(p*2+1))
m2(p)=m1(p*2),c2(p)=c1(p*2);
if(m1(p*2)==m2(p*2+1))
m2(p)=m1(p*2),c2(p)=c1(p*2)+c2(p*2+1);
}
if(m1(p*2)>m1(p*2+1)){
m1(p)=m1(p*2),c1(p)=c1(p*2);
if(m1(p*2+1)<m2(p*2))
m2(p)=m2(p*2),c2(p)=c2(p*2);
if(m1(p*2+1)>m2(p*2))
m2(p)=m1(p*2+1),c2(p)=c1(p*2+1);
if(m1(p*2+1)==m2(p*2))
m2(p)=m1(p*2+1),c2(p)=c1(p*2+1)+c2(p*2);
}
if(m1(p*2)==m1(p*2+1)){
m1(p)=m1(p*2),c1(p)=c1(p*2+1)+c1(p*2);
if(m2(p*2)<m2(p*2+1))
m2(p)=m2(p*2+1),c2(p)=c2(p*2+1);
if(m2(p*2)>m2(p*2+1))
m2(p)=m2(p*2),c2(p)=c2(p*2);
if(m2(p*2)==m2(p*2+1))
m2(p)=m2(p*2),c2(p)=c2(p*2)+c2(p*2+1);
}
}
void build(int p,int l,int r){
if(l==r){
t[p].max1=a[l];
t[p].cnt1=1;
return;
}
int mid=l+(r-l)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
push_up(p);
}
void update(int p,itn l,int r,int pos,int x){
if(l>pos or r<pos)
return;
if(l==r){
t[p].max1=x;
return;
}
int mid=l+(r-l)/2;
update(p*2,l,mid,pos,x);
update(p*2+1,mid+1,r,pos,x);
push_up(p);
}
Node query(int p,int l,int r,int L,int R){
#define m1(x) x.max1
#define m2(y) y.max2
#define c1(x) x.cnt1
#define c2(y) y.cnt2
if(L>r or R<l)
return (Node){0,0,0,0};
if(l<=L and R<=r)return t[p];
int mid=l+(r-l)/2;
Node x=query(p,l,r,L,mid);
Node y=query(p,l,r,mid+1,R);
Node z;
if(m1(x)<m1(y)){
m1(z)=m1(y),c1(z)=c1(y);
if(m1(x)<m2(y))
m2(z)=m2(y),c2(z)=c2(y);
if(m1(x)>m2(y))
m2(z)=m1(x),c2(z)=c1(x);
if(m1(x)==m2(y))
m2(z)=m1(x),c2(z)=c1(x)+c2(y);
}
if(m1(x)>m1(y)){
m1(z)=m1(x),c1(z)=c1(x);
if(m1(y)<m2(x))
m2(z)=m2(x),c2(z)=c2(x);
if(m1(y)>m2(x))
m2(z)=m1(y),c2(z)=c1(y);
if(m1(y)==m2(x))
m2(z)=m1(y),c2(z)=c1(y)+c2(x);
}
if(m1(x)==m1(y)){
m1(z)=m1(x),c1(z)=c1(y)+c1(x);
if(m2(x)<m2(y))
m2(z)=m2(y),c2(z)=c2(y);
if(m2(x)>m2(y))
m2(z)=m2(x),c2(z)=c2(x);
if(m2(x)==m2(y))
m2(z)=m2(x),c2(z)=c2(x)+c2(y);
}
return z;
}
inline void Solve(){
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--){
cin>>op;
if(op==1){
cin>>pos>>x;
update(1,1,n,pos,x);
}
if(op==2){
cin>>l>>r;
Node tmp=query(1,l,r,1,n);
cout<<(tmp.max2?tmp.cnt2:0)<<endl;
}
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
while(T--)
Solve();
return 0;
}