这题调了好久还是没过啊,求助/kk
#include<bits/stdc++.h>
#define int long long
#define hor(i,l,r) for(register int i=l;i<=r;i++)
#define lor(i,l,r) for(register int i=l;i>=r;i--)
#define un unsigned
#define fr front
#define se second
#define fi first
#define pb push_back
using namespace std;
template<typename T> inline void read(T &x){
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
template<typename T> inline void write(T x){
short st[30],tp=0;
if(x<0) putchar('-'),x=-x;
do st[++tp]=x%10,x/=10; while(x);
while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
const int N=1e5+10;
int tag[N],a[N],bls[N],n,q,tot,ls[N],rs[N],b[N],ql,qr,qk,opt,bl=150;
void res(int x){
hor(i,ls[x],rs[x]) b[i]=a[i];
sort(b+ls[x],b+rs[x]+1);
}
void add(int l,int r,int x){
if(bls[l]==bls[r]){
hor(i,l,r) a[i]+=x;
res(bls[l]);
return;
}
hor(i,l,rs[bls[l]]) a[i]+=x;
res(bls[l]);
hor(i,ls[bls[r]],r) a[i]+=x;
res(bls[r]);
for(int i=bls[l]+1;i<bls[r];i++) tag[i]+=x;
}
int lbw(int l,int r,int k){
int ans=0;
if(bls[l]==bls[r]){
hor(i,l,r) if((a[i]+tag[bls[i]])<=k) ans++;
return ans;
}
hor(i,l,rs[bls[l]]) if((a[i]+tag[bls[l]])<=k) ans++;
hor(i,ls[bls[r]],r) if((a[i]+tag[bls[l]])<=k) ans++;
for(int i=bls[l]+1;i<bls[r];i++){
int ll=ls[i],rr=rs[i];
if((b[ll]+tag[i])<k) continue;
if((b[rr]+tag[i])<=k){
ans+=(rr-ll+1);
continue;
}
while(ll<rr){
int mid=((ll+rr)>>1)+1;
if(b[mid]+tag[i]<=k) rr=mid;
else rr=mid-1;
}
if((b[ls[i]]+tag[i])<=k) ans+=(ll-ls[i]+1);
}
return ans;
}
void getjv(int l,int r,int &minn,int &maxn){
if(bls[l]==bls[r]){
hor(i,l,r) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
return;
}
hor(i,l,rs[bls[l]]) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
hor(i,ls[bls[r]],r) minn=min(minn,(a[i]+tag[bls[i]])),maxn=max(maxn,(a[i]+tag[bls[i]]));
for(int i=bls[l]+1;i<bls[r];i++) minn=min(minn,(b[ls[i]]+tag[i])),maxn=max(maxn,(b[rs[i]]+tag[i]));
}
int query(int l,int r,int k){
if(k<1||k>(r-l+1)) return -1;
int minn=0x7fffffffffffffff,maxn=-0x7fffffffffffffff,ans=-1;
getjv(l,r,minn,maxn);
if(k==1) return minn;
if(k==(r-l+1)) return maxn;
while(minn<=maxn){
int mid=(minn+maxn)/2;
if(lbw(l,r,mid)<k) minn=mid+1;
else maxn=mid-1,ans=mid;
}
return ans;
}
signed main(){
rd(n),rd(q);
hor(i,1,n) rd(a[i]);
tot=n/bl;
if(n%bl!=0) tot++;
hor(i,1,tot) ls[i]=(i-1)*bl+1,rs[i]=i*bl;
rs[tot]=n;
hor(i,1,n) bls[i]=(i-1)/bl,b[i]=a[i];
hor(i,1,tot) sort(b+ls[i],b+rs[i]+1);
while(q--){
rd(opt),rd(ql),rd(qr),rd(qk);
if(opt==2) add(ql,qr,qk);
else wr(query(ql,qr,qk)),ed;
}
}