0tps求调,悬2关
查看原帖
0tps求调,悬2关
1405718
JoyLosingK楼主2024/10/1 20:31
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e5+5;
int p[N],a[N],lm[N],rm[N],pos[N],n,m,len,op,x,y,w,add[N],key;
inline int check(int l,int r,int v){
	int ls=pos[l],rs=pos[r],res=0;
	if(ls==rs){ for(int i=l;i<=r;i++) if(a[i]+add[pos[i]]<=v) res++;
		return res;} for(int i=l;i<=rm[ls];i++) if(a[i]+add[pos[i]]<=v) res++;
	for(int i=r;i>=lm[rs];i--) if(a[i]+add[pos[i]]<=v) res++;
	for(int i=ls+1;i<=rs-1;i++){
		int sl=lm[i],sr=rm[i],mid;
		if(p[lm[i]]+add[i]>v) continue;
		if(p[rm[i]]+add[i]<=v){res+=sl-sr+1;continue;}
		while(sl<sr){ mid=((sl+sr)>>1)+1;
			if(p[mid]+add[i]<=v) sl=mid;
			else sr=mid-1;
		} if(p[sl]+add[i]<=v) res+=sl-lm[i]+1;
	} return res;}
inline int get_min(int l,int r){
	int ls=pos[l],rs=pos[r],res=1e8;
	if(ls==rs){ for(int i=l;i<=r;i++) res=min(res,a[i]+add[pos[i]]);
		return res;} for(int i=l;i<=rm[ls];i++) res=min(res,a[i]+add[pos[i]]);
	for(int i=r;i>=lm[rs];i--) res=min(res,a[i]+add[pos[i]]);
	for(int i=ls+1;i<=rs-1;i++) res=min(res,p[lm[i]]+add[pos[i]]);
	return res;}	
inline int get_max(int l,int r){
	int ls=pos[l],rs=pos[r],res=-1e8;
	if(ls==rs){ for(int i=l;i<=r;i++) res=max(res,a[i]+add[pos[i]]);
		return res;} for(int i=l;i<=rm[ls];i++) res=max(res,a[i]+add[pos[i]]);
	for(int i=r;i>=lm[rs];i--) res=max(res,a[i]+add[pos[i]]);
	for(int i=ls+1;i<=rs-1;i++) res=max(res,p[rm[i]]+add[pos[i]]);
	return res;}
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x*f;}
inline void modifly(int l,int r,int v){
	int ls=pos[l],rs=pos[r];
	if(ls==rs){ for(int i=l;i<=r;i++) a[i]+=v;
		for(int i=lm[ls];i<=rm[ls];i++) p[i]=a[i];
		sort(p+lm[rs],p+rm[rs]+1);return;}
	for(int i=l;i<=rm[ls];i++) a[i]+=v;
	for(int i=lm[ls];i<=rm[ls];i++) p[i]=a[i];
	sort(p+lm[ls],p+rm[ls]+1);
	for(int i=r;i>=lm[rs];i--) a[i]+=v;
	for(int i=lm[rs];i<=rm[rs];i++) p[i]=a[i];
	sort(p+lm[rs],p+rm[rs]+1);
	for(int i=ls+1;i<=rs-1;i++) add[i]+=v;
    return;}
inline int query(int l,int r,int v){
	if(v<1||v>r-l+1) return -1;
	int ls=pos[l],rs=pos[r],ans=-1,x=get_min(l,r),y=get_max(l,r),mid;
	while(x<=y){ mid=(x+y)>>1;
		if(check(l,r,mid)<v) x=mid+1;
		else ans=mid,y=mid-1;
	} return ans;}
main(){ n=read(),m=read(),key=sqrt(20*n),len=ceil(n*1.0/key);
	for(int i=1;i<=n;i++) a[i]=read(),p[i]=a[i],pos[i]=(i-1)/key+1;
	for(int i=1;i<=len;i++) lm[i]=(i-1)*key+1,rm[i]=min(i*key,n);
	for(int i=1;i<=len;i++) sort(p+lm[i],p+rm[i]+1);
	while(m--){ op=read(),x=read(),y=read(),w=read();
		if(op==1) cout<<query(x,y,w)<<endl;
		else modifly(x,y,w);
	} return 0;
}
2024/10/1 20:31
加载中...