只能过样例
#include <bits/stdc++.h>
using namespace std;
#define sp putchar(' ')
#define en putchar('\n')
#define pb push_back
#define int long long
#define P 998244353
#define HP 1000000000000002097
#define N (int)2e5+5
int read(){ char ch=getchar();int x=0,f=1;while(ch>'9' || ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f; }
void print(int x){ if(x<0) putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+'0'); }
int n,q;
int a[N];
struct node
{
int l,r,mx1,mx2,s1,s2;//严格最大,次大值,出现次数
}tr[N*4];
void up(int k)
{
int l=k<<1,r=k<<1|1;
if(tr[l].mx1>tr[r].mx1){
tr[k].mx1=tr[l].mx1;
tr[k].s1=tr[l].s1;
if(tr[l].mx2>tr[r].mx1){
tr[k].mx2=tr[l].mx2;
tr[k].s2=tr[l].s2;
}
else if(tr[l].mx2==tr[r].mx1){
tr[k].mx2=tr[l].mx2;
tr[k].s2=tr[l].s2+tr[r].s1;
}
else{
tr[k].mx2=tr[r].mx1;
tr[k].s2=tr[r].s1;
}
}
else if(tr[l].mx1==tr[r].mx1){
tr[k].mx1=tr[l].mx1;
tr[k].s1=tr[l].s1+tr[r].s1;
if(tr[l].mx2>tr[r].mx2){
tr[k].mx2=tr[l].mx2;
tr[k].s2=tr[l].s2;
}
else if(tr[l].mx2==tr[r].mx2){
tr[k].mx2=tr[l].mx2;
tr[k].s2=tr[l].s2+tr[r].s2;
}
else{
tr[k].mx2=tr[r].mx2;
tr[k].s2=tr[r].s2;
}
}
else{
tr[k].mx1=tr[r].mx1;
tr[k].s1=tr[r].s1;
if(tr[r].mx2>tr[l].mx1){
tr[k].mx2=tr[r].mx2;
tr[k].s2=tr[r].s2;
}
else if(tr[r].mx2==tr[l].mx1){
tr[k].mx2=tr[l].mx1;
tr[k].s2=tr[l].s1+tr[r].s2;
}
else{
tr[k].mx2=tr[l].mx1;
tr[k].s2=tr[l].s1;
}
}
}
void build(int k,int l,int r)
{
tr[k]={l,r,0,0,0,0};
if(l==r){
tr[k].mx1=a[l];
tr[k].s1=1;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
up(k);
}
void modify(int k,int l,int r,int val)
{
if(tr[k].l>=l && tr[k].r<=r){
tr[k].mx1=val;
tr[k].s1=1;
return;
}
if(tr[k<<1].r>=l) modify(k<<1,l,r,val);
if(tr[k<<1|1].l<=r) modify(k<<1|1,l,r,val);
up(k);
}
node query(int k,int l,int r)
{
if(tr[k].l>=l && tr[k].r<=r){
return tr[k];
}
node trl,trr,tre;
if(tr[k<<1].r>=l) trl=query(k<<1,l,r);
if(tr[k<<1|1].l<=r) trr=query(k<<1|1,l,r);
if(tr[k<<1].r>=l && tr[k<<1|1].l<=r){
if(trl.mx1>trr.mx1){
tre.mx1=trl.mx1;
tre.s1=trl.s1;
if(trl.mx2>trr.mx1){
tre.mx2=trl.mx2;
tre.s2=trl.s2;
}
else if(trl.mx2==trr.mx1){
tre.mx2=trl.mx2;
tre.s2=trl.s2+trr.s1;
}
else{
tre.mx2=trr.mx1;
tre.s2=trr.s1;
}
}
else if(trl.mx1==trr.mx1){
tre.mx1=trl.mx1;
tre.s1=trl.s1+trr.s1;
if(trl.mx2>trr.mx2){
tre.mx2=trl.mx2;
tre.s2=trl.s2;
}
else if(trl.mx2==trr.mx2){
tre.mx2=trl.mx2;
tre.s2=trl.s2+trr.s2;
}
else{
tre.mx2=trr.mx2;
tre.s2=trr.s2;
}
}
else{
tre.mx1=trr.mx1;
tre.s1=trr.s1;
if(trr.mx2>trl.mx1){
tre.mx2=trr.mx2;
tre.s2=trr.s2;
}
else if(trr.mx2==trl.mx1){
tre.mx2=trl.mx1;
tre.s2=trl.s1+trr.s2;
}
else{
tre.mx2=trl.mx1;
tre.s2=trl.s1;
}
}
return tre;
}
else if(tr[k<<1].r>=l) return trl;
else if(tr[k<<1|1].l<=r) return trr;
}
main()
{
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(q--){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
modify(1,x,x,y);
}
else{
node ans=query(1,x,y);
cout<<ans.s2<<"\n";
}
}
return 0;
}