block=233\300
就没问题
其他比如400,500就有问题
为啥啊?
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define mid ((el+er)>>1)
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define ROF(i,a,b) for(int i=(a); i>=(b); --i)
using namespace std;
bool happy1041;
ll time1=clock();
//
const ll N=1e5,block=903;
ll a[N+10],kto;
ll kl[N/block+10],kr[N/block+10],klz[N/block+10],ka[N+10],gba[N/block+10],gbb[N/block+10];
//
inline char gc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline ll gt(){
ll t=0,f=0;char v=getchar();
while(!isdigit(v)) f|=(v=='-'),v=getchar();
while(isdigit(v)) t=(t<<3)+(t<<1)+(v^48),v=getchar();
return f?-t:t;
}
inline void wr(ll x){
if(x>9) wr(x/10);
putchar(x%10+'0');
return;
}
void msort(ll ord,ll l,ll r,ll k){
ll g1=0,g2=0,to=kr[ord];
FOR(i,kl[ord],kr[ord]){
if(l<=ka[i]&&ka[i]<=r){
gba[++g1]=ka[i]; a[ka[i]]+=k;
}
else gbb[++g2]=ka[i];
}
while(g1&&g2) ka[to--]=(a[gba[g1]]>a[gbb[g2]])?gba[g1--]:gbb[g2--];
while(g1) ka[to--]=gba[g1--];
while(g2) ka[to--]=gbb[g2--];
}
bool cmp(ll x,ll y){
return a[x]<a[y];
}
bool Happy1041;
void usage() {
ll time2=clock();
cout<<(&Happy1041-&happy1041)/1024/1024<<" Mb, "<<time2-time1<<" Ms\n";
}
int main() {
// freopen("poker.in","r",stdin);
// freopen("poker.out","w",stdout);
ll n=gt(),m=gt();
FOR(i,1,n) a[i]=gt(); ll kto=(n-1)/block+1;
FOR(i,1,kto) kl[i]=kr[i-1]+1,kr[i]=kr[i-1]+block;
kr[kto]=n; kl[kto+1]=n+1; kr[0]=0;
FOR(i,1,kto){
FOR(j,kl[i],kr[i]) ka[j]=j;
sort(ka+kl[i],ka+kr[i]+1,cmp);
}
FOR(i,1,m){
ll opt=gt(),l=gt(),r=gt(),k=gt();
if(opt==2){
ll st=lower_bound(kl+1,kl+kto+1,l)-kl,en=upper_bound(kr+1,kr+kto+1,r)-kr-1;
// printf("%lld %lld %lld %lld\n",st,en,kl[st],kr[en]);
if(st>en+1) msort(en+1,l,r,k);
else{
FOR(j,st,en) klz[j]+=k;
// printf("%lld %lld\n",l,kr[st-1]);
msort(st-1,l,kr[st-1],k);
// printf("%lld %lld\n",kl[en+1],r);
msort(en+1,kl[en+1],r,k);
}
}
else{
ll el=-2e4*i,er=2e4*i,st=lower_bound(kl+1,kl+kto+1,l)-kl,en=upper_bound(kr+1,kr+kto+1,r)-kr-1;
if(r-l+1<k){
printf("-1\n"); continue;
}
// printf("%lld %lld %lld %lld\n",st,en,kl[st],kr[en]);
while(el<er){
// printf("%lld %lld\n",el,er);
ll tot=0;
if(st>en+1){
FOR(j,l,r)
if(a[j]+klz[st-1]<=mid) ++tot;
// printf("%lld\n",tot);
}
else{
FOR(j,l,kl[st]-1)
if(a[j]+klz[st-1]<=mid) ++tot;
// printf("%lld\n",tot);
FOR(j,kr[en]+1,r)
if(a[j]+klz[en+1]<=mid) ++tot;
// printf("%lld\n",tot);
FOR(j,st,en){
ll tl=kl[j],tr=kr[j]+1;
while(tl<tr){
// printf("%lld %lld\n",tl,tr);
ll mmid=(tl+tr)>>1;
(a[ka[mmid]]+klz[j]>mid)?tr=mmid:tl=mmid+1;
}
tot+=tl-kl[j];
}
// printf("%lld\n",tot);
}
(tot>=k)?er=mid:el=mid+1;
}
printf("%lld\n",el);
}
// FOR(j,1,n) printf("%lld ",a[ka[j]]); printf("\n");
// FOR(j,1,kto) printf("%lld ",klz[j]); printf("\n");
}
}