#include <bits/stdc++.h>
using namespace std;
long long read(){
long long x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
void write(long long x){
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
long long n,m,op,x,y,l,r;
long long a[200005];
set<long long> s;
struct St{
long long Max1,Max2;
long long sum1,sum2;
St(){
Max1=Max2=sum1=sum2=0;
}
};
struct Node{
long long l,r;
St h;
}X[200005<<2];
St Union(St a,St b){
St ans;
s.clear();
ans.sum1=ans.sum2=0;
ans.Max1=max(a.Max1,b.Max1);
if(ans.Max1==a.Max1)ans.sum1+=a.sum1;
if(ans.Max1==b.Max1)ans.sum1+=b.sum1;
s.insert(a.Max1);
if(a.Max2)s.insert(a.Max2);
s.insert(b.Max1);
if(b.Max2)s.insert(b.Max2);
if(s.size()==1){
ans.Max2=0;
return ans;
}
auto it=s.end();
it--;
it--;
ans.Max2=*it;
if(ans.Max2==a.Max1)ans.sum2+=a.sum1;
if(ans.Max2==b.Max1)ans.sum2+=b.sum1;
if(ans.Max2==a.Max2)ans.sum2+=a.sum2;
if(ans.Max2==b.Max2)ans.sum2+=b.sum2;
return ans;
}
void pushup(long long k){
X[k].h=Union(X[k<<1].h,X[k<<1|1].h);
}
void build(long long k,long long l,long long r){
X[k].l=l,X[k].r=r;
if(l==r){
X[k].h.Max1=a[l];
X[k].h.sum1=1;
return ;
}
long long mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void add(long long k,long long i,long long v){
if(X[k].l==i&&i==X[k].r){
X[k].h.Max1=v;
return ;
}
long long mid=(X[k].l+X[k].r)>>1;
if(i<=mid)add(k<<1,i,v);
else add(k<<1|1,i,v);
pushup(k);
}
St qurey(long long k,long long l,long long r){
if(X[k].l==l&&r==X[k].r)
return X[k].h;
long long mid=(X[k].l+X[k].r)>>1;
if(r<=mid)return qurey(k<<1,l,r);
else if(l>mid)return qurey(k<<1|1,l,r);
else return Union(qurey(k<<1,l,mid),qurey(k<<1|1,mid+1,r));
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
while(m--){
op=read(),x=read(),y=read();
if(op==1)add(1,x,y);
else{
write(qurey(1,x,y).sum2);
putchar('\n');
}
}
return 0;
}