玄关求条(必关)
查看原帖
玄关求条(必关)
1380111
easy42楼主2025/6/14 23:00

请各位巨佬过来看一看!

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int n,m;
int a[100005],b[100005],kk[100005];
int st[100005],ed[1000005];
int cnt[100005],add[100005],maxx[100005],minn[100005];
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int block=sqrt(n);
	int t=n/block;
	if(n%block) t++;
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
	ed[t]=n;
	for(int i=1;i<=n;i++){
		cnt[i]=(i-1)/block+1;
	}
	for(int i=1;i<=t;i++){
		minn[i]=INT_MAX,maxx[i]=-INT_MAX;
		for(int j=st[i];j<=ed[i];j++){
			b[j]=a[j];
			minn[i]=min(minn[i],a[j]);
			maxx[i]=max(maxx[i],a[j]);
		}
		sort(b+st[i],b+ed[i]+1);
	}
	while(m--){
		int op,l,r,k;
		cin>>op>>l>>r>>k;
		if(op==1){
			if(k<=0||k>(r-l+1)){
				cout<<-1<<endl;
				continue;
			}
			if(cnt[l]==cnt[r]){
				for(int i=l;i<=r;i++){
					kk[i]=a[i]+add[cnt[i]];
				}
				sort(kk+l,kk+r+1);
				cout<<kk[l+k-1]<<endl;
			}
			else{
				int tmin=INT_MAX,tmax=-INT_MAX;
				for(int i=l;i<=ed[cnt[l]];i++){
					tmin=min(tmin,a[i]+add[cnt[i]]);
					tmax=max(tmax,a[i]+add[cnt[i]]);
				}
				for(int i=st[cnt[r]];i<=r;i++){
					tmin=min(tmin,a[i]+add[cnt[i]]);
					tmax=max(tmax,a[i]+add[cnt[i]]);
				}
				for(int i=cnt[l]+1;i<=cnt[r]-1;i++){
					tmin=min(tmin,minn[i]);
					tmax=max(tmax,maxx[i]);
				}
				int tl=tmin,tr=tmax,qans=-1;
				while(tl<=tr){
					int mid=(tl+tr)/2,ans1=0,ans2=0;
					for(int i=l;i<=ed[cnt[l]];i++){
						if(a[i]+add[cnt[i]]<=mid) ans1++;
						if(a[i]+add[cnt[i]]<=mid-1) ans2++;
					}
					for(int i=st[cnt[r]];i<=r;i++){
						if(a[i]+add[cnt[i]]<=mid) ans1++;
						if(a[i]+add[cnt[i]]<=mid-1) ans2++;
					}
					for(int i=cnt[l]+1;i<=cnt[r]-1;i++){
						int fl=st[i],fr=ed[i],fmid,hans=-1;
						while(fl<=fr){
							fmid=(fl+fr)/2;
							if(b[fmid]+add[i]<=mid) fl=fmid+1,hans=fmid;
							else fr=fmid-1;
						}
						if(hans!=-1) ans1+=hans-st[i]+1;
					}
					for(int i=cnt[l]+1;i<=cnt[r]-1;i++){
						int fl=st[i],fr=ed[i],fmid,hans=-1;
						while(fl<=fr){
							fmid=(fl+fr)/2;
							if(b[fmid]+add[i]<=mid-1) fl=fmid+1,hans=fmid;
							else fr=fmid-1;
						}
						if(hans!=-1) ans2+=hans-st[i]+1;
					}
					if(tl==tr){
						qans=tl;
						break;
					}
					if(ans2<k&&ans1>=k){
						qans=mid;
						break;
					}
					else if(ans1<k)	tl=mid+1;
					else tr=mid-1;		
				}
				cout<<qans<<endl;				
			}
		}
		else{
			if(cnt[l]==cnt[r]){
				for(int i=st[cnt[l]];i<=ed[cnt[l]];i++){
					a[i]+=add[cnt[l]];
				}
				add[cnt[l]]=0;
				for(int i=l;i<=r;i++){
					a[i]+=k;
				}
				minn[cnt[l]]=INT_MAX,maxx[cnt[l]]=-INT_MAX;
				for(int i=st[cnt[l]];i<=ed[cnt[l]];i++){
					minn[cnt[l]]=min(minn[cnt[l]],a[i]);
					maxx[cnt[l]]=max(maxx[cnt[l]],a[i]);
				}
			}
			else{
				for(int i=st[cnt[l]];i<=ed[cnt[l]];i++){
					a[i]+=add[cnt[l]];
					b[i]=a[i];
				}
				add[cnt[l]]=0;
				for(int i=l;i<=ed[cnt[l]];i++){
					a[i]+=k;
				}
				minn[cnt[l]]=INT_MAX,maxx[cnt[l]]=-INT_MAX;
				for(int i=st[cnt[l]];i<=ed[cnt[l]];i++){
					minn[cnt[l]]=min(minn[cnt[l]],a[i]);
					maxx[cnt[l]]=max(maxx[cnt[l]],a[i]);
				}
				sort(b+st[cnt[l]],b+ed[cnt[l]]+1);
				for(int i=st[cnt[r]];i<=ed[cnt[r]];i++){
					a[i]+=add[cnt[r]];
					b[i]=a[i];
				}
				add[cnt[r]]=0;
				for(int i=st[cnt[r]];i<=r;i++){
					a[i]+=k;
				}
				minn[cnt[r]]=INT_MAX,maxx[cnt[r]]=-INT_MAX;
				for(int i=st[cnt[r]];i<=ed[cnt[r]];i++){
					minn[cnt[r]]=min(minn[cnt[r]],a[i]);
					maxx[cnt[r]]=max(maxx[cnt[r]],a[i]);
				}
				sort(b+st[cnt[r]],b+ed[cnt[r]]+1);
				for(int i=cnt[l]+1;i<=cnt[r]-1;i++){
					add[i]+=k;
					minn[i]+=k;
					maxx[i]+=k;
				}				
			}
		}
	}
	return 0;
}
2025/6/14 23:00
加载中...