萌新刚学OI,全WA,求助分块
查看原帖
萌新刚学OI,全WA,求助分块
379420
Xuejiama1227楼主2023/2/16 19:43
#include<bits/stdc++.h>
using namespace std;
const int N=114514;
const int INF=1e9+7;
int n,cnt,b[N],id[N];
int a[N],la[N];
int s[N];
void init(int n){
	int k,i;
	k=sqrt(n);
	for(i=0;i<n;i++){
		if(i%k==0)id[i/k+1]=i+1;
		b[i+1]=i/k+1;
	}
	id[(n-1)/k+2]=n+1;
	cnt=(n-1)/k+1;
}
void build(int x){
	int i;
	for(i=id[x];i<id[x+1];i++)a[i]+=la[x];
	la[x]=0;
	for(i=id[x];i<id[x+1];i++)s[i]=a[i];
	sort(s+id[x],s+id[x+1]);
}
int query(int x,int c){
	int *k=upper_bound(s+id[x],s+id[x+1],c-la[x]);
	return k-s-id[x];
}
int main(){
	int i,q,op,l,r,ans,c,tl,tr,mid,ct;
	scanf("%d%d",&n,&q);init(n);
	for(i=1;i<=n;i++)scanf("%d",a+i);
	for(i=1;i<=cnt;i++)build(i);
	while(q--){
		scanf("%d%d%d%d",&op,&l,&r,&c);
		if(op==2){
			if(b[r]==b[l]){
				for(i=l;i<=r;i++)a[i]+=c;
				build(b[l]);
			}else{
				for(i=l;i<id[b[l]+1];i++)a[i]+=c;
				for(i=id[b[r]];i<=r;i++)a[i]+=c;
				for(i=b[l]+1;i<b[r];i++)la[i]+=c;
				build(b[l]);build(b[r]);
			}
		}else{
			if(c<1||c>(r-l+1))printf("-1");
			else if(b[r]==b[l]){
				tl=-200000;tr=200000;
				while(tl<=tr){
					mid=(tl+tr)/2;ct=0;
					for(i=l;i<=r;i++)if(a[i]+la[b[i]]<=mid)ct++;
					if(ct<c)tl=mid+1;
					else tr=mid-1,ans=mid;
				}
				printf("%d\n",ans);
			}else{
				tl=-200000;tr=200000;
				while(tl<=tr){
					mid=(tl+tr)/2;ct=0;
					for(i=l;i<id[b[l]+1];i++)if(a[i]+la[b[l]]<=mid)ct++;
					for(i=id[b[r]];i<=r;i++)if(a[i]+la[b[r]]<=mid)ct++;
					for(i=b[l]+1;i<b[r];i++)ct+=query(i,mid);
					if(ct<c)tl=mid+1;
					else tr=mid-1,ans=mid;
				}
				printf("%d\n",ans);
			}
		}
	}
	return 0;
}
2023/2/16 19:43
加载中...