rt,后两个 subtask WA 了
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,q,opt,l,r;
ll x,a[1000005],lazy[4000005],lt[4000005],rt[4000005];
bitset<4000005> bt;
void Add(int p,int l1,int r1,int l2,int r2,ll x){
if(l2<=l1&&r1<=r2){
lazy[p]+=x,lt[p]+=x,rt[p]+=x;
return ;
}
int mid=l1+r1>>1;
if(l2<=mid) Add(p<<1,l1,mid,l2,r2,x);
if(r2>mid) Add(p<<1|1,mid+1,r1,l2,r2,x);
bt[p]=(bt[p<<1]&&bt[p<<1|1]&&rt[p<<1]<=lt[p<<1|1]),
lt[p]=lt[p<<1],rt[p]=rt[p<<1|1];
}
bool query(int p,int l1,int r1,int l2,int r2){
if(l2<=l1&&r1<=r2)
return bt[p];
int mid=l1+r1>>1;
if(lazy[p]) lazy[p<<1]+=lazy[p],lazy[p<<1|1]+=lazy[p],
lt[p<<1]+=lazy[p],rt[p<<1]+=lazy[p],lt[p<<1|1]+=lazy[p],rt[p<<1|1]+=lazy[p],lazy[p]=0;
if(mid>=r2) return query(p<<1,l1,mid,l2,r2);
if(mid<l2) return query(p<<1|1,mid+1,r1,l2,r2);
return query(p<<1,l1,mid,l2,r2)&&query(p<<1|1,mid+1,r1,l2,r2)&&rt[p<<1]<=lt[p<<1|1];
}
void build(int p,int l1,int r1){
lt[p]=a[l1],rt[p]=a[r1];
if(l1==r1){
bt[p]=1;
return ;
}
int mid=l1+r1>>1;
build(p<<1,l1,mid);
build(p<<1|1,mid+1,r1);
if(bt[p<<1]&&bt[p<<1|1]&&rt[p<<1]<=lt[p<<1|1]) bt[p]=1;
}
int 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--){
cin>>opt>>l>>r;
if(r==n+1) r=n;
if(opt==1) cin>>x,Add(1,1,n,l,r,x);
else if(query(1,1,n,l,r)) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}