卡常剩余160ms求调
查看原帖
卡常剩余160ms求调
841638
Igunareo楼主2024/10/5 17:32
#include<bits/stdc++.h>
namespace IO{
	template<typename T> inline void write(T x) {
	    if(x<0) putchar('-'),x=-x;
	    if(!x){
	        putchar('0');
	        return ;
	    }
	    if(x>9) write(x/10);
	    putchar(x%10+'0'); 
	    return ;
	}
	template<typename T> inline void read(T &x) {
		int w = 1;
		char ch = getchar();
		x=0;
	    while(!isdigit(ch)){ 
			if(ch=='-') w=-1;
			ch=getchar(); 
		}
	    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	    x*=w;
	    return ;
	}
}
using namespace IO;
using namespace std;
int x[100005],n,m,els,i,j,z[100005],L[100005],R[100005],num[100005],y[100005],tag[100005],legth=350,gnum;
inline void build(){
	gnum=n/legth;
	for(i=1;i<=gnum;++i){
		L[i]=R[i-1]+1;
		R[i]=L[i]+legth-1;
	}
	if(R[gnum]!=n){
		L[gnum+1]=R[gnum]+1;
		++gnum;
		R[gnum]=n;
	}
	for(i=1;i<=gnum;++i){
		for(int j=L[i];j<=R[i];++j){
			num[j]=i;
			y[j]=x[j];
		}
		sort(y+L[i],y+R[i]+1);
	}
	return;
}
inline void up(int l,int r,int val){
	int bl=num[l],br=num[r];
	if(bl==br){
		for(i=l;i<=r;++i)x[i]=x[i]+val;
		for(i=L[bl];i<=R[br];++i)y[i]=x[i];
		sort(y+L[bl],y+R[bl]+1);
		return;
	}
	for(i=l;i<=R[bl];++i)x[i]=x[i]+val;
	for(i=L[bl];i<=R[bl];++i)y[i]=x[i];
	sort(y+L[bl],y+R[bl]+1);
	for(i=bl+1;i<=br-1;++i)tag[i]=tag[i]+val;
	for(i=L[br];i<=r;++i)x[i]=x[i]+val;
	for(i=L[br];i<=R[br];++i)y[i]=x[i];
	sort(y+L[br],y+R[br]+1);
	return;
}
inline int query(int now,int k){
	k=k-tag[now];
	int l=L[now],r=R[now];
	if(y[l]>k)return 0;
	while(l<r){
		int mid=((l+r)>>1)+((l+r)&1);
		if(l==r-1)mid=r;
		if(y[mid]>k)r=mid-1;
		else l=mid;
	}
	return l-L[now]+1;
}
inline int mo(int k){
	int l=1,r=els;
	if(z[1]>k)return 0;
	while(l<r){
		int mid=((l+r)>>1)+((l+r)&1);
		if(z[mid]>k)r=mid-1;
		else l=mid;
	}
	return l;
}
inline int down(int l,int r,int k){
	if(k<1||k>r-l+1)return -1;
	int bl=num[l],br=num[r],lef=y[L[bl]]+tag[bl],rig=y[R[bl]]+tag[bl];
	for(i=bl+1;i<=br;++i){
		lef=min(lef,y[L[i]]+tag[i]);
		rig=max(rig,y[R[i]]+tag[i]);
	}
	els=0;
	if(num[l]==num[r])for(int i=l;i<=r;++i)z[++els]=x[i]+tag[bl];
	else{
		for(i=l;i<=R[bl];++i)z[++els]=x[i]+tag[bl];
		for(i=L[br];i<=r;++i)z[++els]=x[i]+tag[br];
	}
	sort(z+1,z+els+1);
	while(lef<rig){
		int mid=((1ll*lef+rig)>>1),summ=mo(mid);
		for(i=bl+1;i<=br-1;++i)summ=summ+query(i,mid);
		if(summ<k)lef=mid+1;
		else rig=mid;
	}
	return lef;
}
int main(){
	read(n);
	read(m);
	for(i=1;i<=n;++i)read(x[i]);
	build();
	int kind,l,r,k;
	for(int o=1;o<=m;++o){
		read(kind);read(l);read(r);read(k);
		if(kind==2)up(l,r,k);
		else{write(down(l,r,k));putchar('\n');}
	}
	return 0;
}
2024/10/5 17:32
加载中...