垃圾代码求调
查看原帖
垃圾代码求调
525141
_shine_楼主2024/1/28 11:57
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int maxn=1e5+10;
int n,m,len,siz,a[maxn],num[maxn];
struct node{
	int id,cnt;
	
}v[maxn];
int l[maxn],r[maxn],tag[maxn];
inline void get_sort(int l,int r,int k){
	for(int i=(num[l]-1)*len+1;i<min(num[l]*len,n);++i)if(l<v[i].id && v[i].id<r)v[i].cnt+=k,a[v[i].id]+=k;
	sort(v+(num[l]-1)*len+1,v+min(num[l]*len,n)+1,[](node x,node y){return x.cnt<y.cnt;});
}
inline void add(int l,int r,int kk){
	if(num[l]==num[r]){get_sort(l,r,kk);return ;}
	for(int k=num[l]+1;k<num[r];++k)tag[k]+=kk;
	get_sort(l,num[l]*len,kk);get_sort((num[r]-1)*len+1,r,kk);
}
inline int find(int l,int r,int kk){
	if(r-l+1<kk)return -1;
	if(num[l]==num[r]){
		vector<int>e;for(int i=0;i<=r-l;++i)e.push_back(a[i+l]);
		sort(e.begin(),e.end());return e[kk-1]+tag[num[l]];
	}
	int L=-2*10*10*10*10,R=2*10*10*10*10;
	while(l<r){
		int mid=(L+R)/2;int cnt=0;
		for(int k=num[l]+1;k<num[r];++k){
			if(v[k*len].cnt+tag[k]<=mid)cnt+=len;
			else if(v[(k-1)*len+1].cnt+tag[k]<=mid){
				int l1=(k-1)*len+1,r1=k*len;
				while(l1<r1){
					int mid=(l1+r1)/2;
					if(v[mid].cnt+tag[kk]>mid)r1=mid-1;
					else l1=mid;
				}
				cnt+=l1-(k-1)*len-1;
			}
		}
		for(int k=l;k<num[l]*len;++k)if(a[k]+tag[num[k]]<=mid)++cnt;
		for(int k=((num[r]-1)*len+1);k<=r;++k)if(a[k]+tag[num[r]]<=mid)++cnt;
		if(cnt>=kk)r=mid;
		else l=mid+1;
	}
	return l;
}
signed main(){
	scanf("%lld%lld",&n,&m);len=sqrt(n);for(int i=1;i<=n;++i){scanf("%lld",a+i);v[i].id=i,v[i].cnt=a[i];num[i]=(i-1)/len+1;}
	siz=n/len;if(n%len!=0)siz++;for(int i=1;i<siz;++i){sort(v+((i-1)*len+1),v+(i*len)+1,[](node x,node y){return x.cnt<y.cnt;});}
	sort(v+n-len+1,v+n+1,[](node x,node y){return x.cnt<y.cnt;});
	for(int i=1;i<=m;++i){int op,l,r,k;scanf("%lld%lld%lld%lld",&op,&l,&r,&k);if(op==1)printf("%lld\n",find(l,r,k));else add(l,r,k);}	
	return 0;
}
2024/1/28 11:57
加载中...