线段树没过,怎么回事呢?
#include <bits/stdc++.h>
#define int long long
#define maxm 2000005
#define maxn 1005
#define inf 0x3f3f3f3f3f3f3f
using namespace std;
int n,m,sum;
int a[maxm];
struct Seg{
int l,r,mxf,cntf,mxs,cnts;
}t[maxm],ans;
#define lc 2*k
#define rc 2*k+1
void Pushup(int k){
t[k].mxf=max(t[lc].mxf,t[rc].mxf);
if(t[lc].mxf!=t[rc].mxf)t[k].mxs=min(t[lc].mxf,t[rc].mxf);
else t[k].mxs=max(t[lc].mxs,t[rc].mxs);
if(t[lc].mxf==t[rc].mxf)t[k].cntf=t[lc].cntf+t[rc].cntf;
else if(t[lc].mxf==t[k].mxf)t[k].cntf=t[lc].cntf;
else if(t[rc].mxf==t[k].mxf)t[k].cntf=t[rc].cntf;
t[k].cnts=0;
if(t[k].mxs!=-1){
if(t[lc].mxf==t[k].mxs)t[k].cnts+=t[lc].cntf;
if(t[rc].mxf==t[k].mxs)t[k].cnts+=t[rc].cntf;
if(t[rc].mxs==t[k].mxs)t[k].cnts+=t[rc].cnts;
if(t[lc].mxs==t[k].mxs)t[k].cnts+=t[lc].cnts;
}
}
void Build(int k,int l,int r){
t[k]=(Seg){l,r,0,0,-1,0};
if(l==r){
t[k].mxf=a[l];
t[k].cntf=1;
return;
}
int mid=l+r>>1;
Build(lc,l,mid);
Build(rc,mid+1,r);
Pushup(k);
}
void Add(int k,int x,int z){
if(t[k].l>x||t[k].r<x)return ;
if(t[k].l==t[k].r){
t[k].cntf=1;
t[k].mxf=z;
t[k].mxs=-1;
t[k].cnts=0;
return;
}
Add(lc,x,z);
Add(rc,x,z);
Pushup(k);
}
void AskS(int k,int l,int r){
if(t[k].l>r||t[k].r<l)return ;
if(t[k].l>=l&&t[k].r<=r){
if(ans.mxf<t[k].mxf){
ans.mxs=ans.mxf;
ans.mxf=t[k].mxf;
if(ans.mxs<t[k].mxs)ans.mxs=t[k].mxs;
}
else if(ans.mxs<t[k].mxf&&t[k].mxf!=ans.mxf)ans.mxs=t[k].mxf;
else if(ans.mxs<t[k].mxs&&t[k].mxs!=ans.mxf)ans.mxs=t[k].mxs;
return;
}
AskS(lc,l,r);
AskS(rc,l,r);
}
void Ask(int k,int l,int r,int x){
//cout<<t[k].l<<" "<<t[k].r<<" "<<t[k].mxf<<" "<<t[k].mxs<<" "<<t[k].cntf<<"\n";
if(t[k].l>r||t[k].r<l||t[k].mxf<x)return ;
if(t[k].l>=l&&t[k].r<=r&&t[k].mxf==x){
sum+=t[k].cntf;
return;
}
if(t[k].l>=l&&t[k].r<=r&&t[k].mxs==x){
sum+=t[k].cnts;
return;
}
if(t[k].l==t[k].r)return;
Ask(lc,l,r,x);
Ask(rc,l,r,x);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
Build(1,1,n);
for(int i=1;i<=m;i++){
int op,x,y,z;
cin>>op>>x>>y;
if(op==1)Add(1,x,y);
else{
sum=0;
ans=(Seg){0,0,-1,-1,-1,-1};
AskS(1,x,y);
if(ans.mxs==-1){
cout<<"0\n";
continue;
}
//cout<<"second"<<ans.mxs<<"\n";
Ask(1,x,y,ans.mxs);
cout<<sum<<"\n";
}
}
return 0;
}