RT
#include<bits/stdc++.h>
using namespace std;
long long t;
const long long N = 2e5 + 10;
long long n,m;
long long a[N],max1[500010],max2[500010];
long long num1[500010],num2[500010];
struct node {
long long x,y;
};
void up(long long k) {
max1[k] = max2[k] = num1[k] = num2[k] = 0;
set<long long,greater<long long> > tq;
tq.insert(max1[k * 2]);
tq.insert(max2[k * 2]);
tq.insert(max1[k * 2 + 1]);
tq.insert(max2[k * 2 + 1]);
set<long long>::iterator it = tq.begin();
max1[k] = *it;
if(max1[k * 2] == *it) num1[k] += num1[k * 2];
if(max2[k * 2] == *it) num1[k] += num2[k * 2];
if(max1[k * 2 + 1] == *it) num1[k] += num1[k * 2 + 1];
if(max2[k * 2 + 1] == *it) num1[k] += num2[k * 2 + 1];
it++;
if(*it != 0) {
max2[k] = *it;
if(max1[k * 2] == *it) num2[k] += num1[k * 2];
if(max2[k * 2] == *it) num2[k] += num2[k * 2];
if(max1[k * 2 + 1] == *it) num2[k] += num1[k * 2 + 1];
if(max2[k * 2 + 1] == *it) num2[k] += num2[k * 2 + 1];
}
}
void build(long long k,long long l,long long r) {
if(l == r) {
max1[k] = a[l];
num1[k] = 1;
return;
}
long long mid = (l + r) >> 1;
build(k * 2,l,mid);
build(k * 2 + 1,mid + 1,r);
up(k);
}
void modify(long long k,long long l,long long r,long long pos,long long v) {
if(l > pos || r < pos) return;
if(l == r && l == pos) {
max1[k] = a[l] = v;
max2[k] = 0;
num1[k] = 1;
num2[k] = 0;
return ;
}
long long mid = (l + r) >> 1;
modify(k * 2,l,mid,pos,v);
modify(k * 2 + 1,mid + 1,r,pos,v);
up(k);
}
node query1(long long k,long long l,long long r,long long x,long long y) {
if(l > y || r < x) return {0,0};
if(l >= x && r <= y) return {max1[k],max2[k]};
long long mid = (l + r) >> 1;
node res = query1(k * 2,l,mid,x,y);
node tmp = query1(k * 2 + 1,mid + 1,r,x,y);
if(res.x > tmp.x) {
if(res.y >= tmp.x) return res;
else return {res.x,tmp.x};
}
else if(res.x < tmp.x) {
if(tmp.y >= res.x) return tmp;
else return {tmp.x,res.x};
}
else {
if(res.y > tmp.y) return res;
else return tmp;
}
}
long long query2(long long k,long long l,long long r,long long x,long long y,long long v) {
if(l > y || r < x) return 0;
if(l >= x && r <= y) {
if(v == max1[k]) return num1[k];
else if(v == max2[k]) return num2[k];
else return 0;
}
long long mid = (l + r) >> 1;
long long res = 0;
res = query2(k * 2,l,mid,x,y,v) + query2(k * 2 + 1,mid + 1,r,x,y,v);
return res;
}
void solve() {
cin >> n >> m;
for(long long i = 1;i <= n;i++) cin >> a[i];
build(1,1,n);
for(long long i = 1;i <= m;i++) {
long long pd,x,y;
cin >> pd >> x >> y;
if(pd == 1)
modify(1,1,n,x,y);
else {
node tmp = query1(1,1,n,x,y);
if(tmp.y == 0) cout << 0 << '\n';
else cout << query2(1,1,n,x,y,tmp.y) << '\n';
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
t = 1;
while(t--) solve();
return 0;
}