大佬救命!0pts分块,
查看原帖
大佬救命!0pts分块,
307531
Pentalobe楼主2022/10/9 19:55

提交记录

#include <bits/stdc++.h>
using namespace std;
#define int long long  
const int N=1e5+5;
inline int read() {
	int s=0,t=1;
	char ch=getchar();
	while (ch<'0'|ch>'9') {
		if (ch=='-') t=-1;
		ch=getchar();
	}
	while (ch>='0'&ch<='9') {
		s=(s<<1)+(s<<3)+ch-'0';
		ch=getchar();
	}
	return s*t;
}
int n,m,a[N],cl[N],L[N],R[N],pos[N],mk[N],c[N];
int merge(int l,int r,int x) {
	while (l<r) {
		int mid=l+r+1>>1;
		if (cl[mid]+mk[pos[mid]]>x) r=mid-1;
		else l=mid;
	}
	return r;
}
signed main() {
	n=read(),m=read();
	for (int i=1;i<=n;i++) {
		a[i]=read();
		cl[i]=a[i];
	}
	int len=sqrt(n*1.0);
	for (int i=1;i<=len;i++) {
		L[i]=(i-1)*len+1;
		R[i]=i*len;
	}
	if (R[len]!=n) {
		len++;
		L[len]=R[len-1]+1;
		R[len]=n;
	}
	for (int i=1;i<=len;i++) {
		for (int j=L[i];j<=R[i];j++) {
			pos[j]=i;
		}
		sort(cl+L[i],cl+R[i]+1); 
	}
	int opt,l,r,x;
	while (m--) {
		opt=read(),l=read(),r=read(),x=read();
		if (opt==2) {
			if (pos[l]==pos[r]) {
				for (int i=l;i<=r;i++) {
					a[i]+=x;
				}
				for (int i=L[pos[l]];i<=R[pos[l]];i++) {
					cl[i]=a[i];
				}
				sort(cl+L[pos[l]],cl+R[pos[l]]+1);
			}
			else {
				for (int i=l;i<=R[pos[l]];i++) {
					a[i]+=x;
				}
				for (int i=L[pos[l]];i<=R[pos[l]];i++) {
					cl[i]=a[i];
				}
				sort(cl+L[pos[l]],cl+R[pos[l]]+1);
				for (int i=L[pos[r]];i<=r;i++) {
					a[i]+=x;
				}
				for (int i=L[pos[r]];i<=R[pos[r]];i++) {
					cl[i]=a[i];
				}
				sort(cl+L[pos[r]],cl+R[pos[r]]+1);
				for (int i=pos[l]+1;i<=pos[r]-1;i++) {
					mk[i]+=x;
				}
			}
		}
		else {
			int rk;
			if (r-l+1<x||x<=0) {
				printf ("-1\n");
				continue;
			}
//			printf ("%lld %lld\n",l,r);
			if (pos[l]==pos[r]) {
				for (int i=l;i<=r;i++) {
					c[i]=a[i]+mk[pos[l]];
				}
				sort(c+l,c+r+1);
				printf ("%lld\n",c[x]);
			}
			else {
				int ll=2e9,rr=-2e9;
				for (int i=l;i<=R[pos[l]];i++) {
					ll=min(ll,a[i]+mk[pos[l]]);
					rr=max(rr,a[i]+mk[pos[l]]);
				}
				for (int i=L[pos[r]];i<=r;i++) {
					ll=min(ll,a[i]+mk[pos[r]]);
					rr=max(rr,a[i]+mk[pos[r]]);
				}
				for (int i=pos[l]+1;i<=pos[r]-1;i++) {
					ll=min(ll,cl[L[i]]+mk[i]);
					rr=max(rr,cl[R[i]]+mk[i]);
				}
				if (x==1) {
					printf ("%lld\n",ll);
					continue;
				} 
				if (x==r-l+1) {
					printf ("%lld\n",rr);
					continue;
				}
				int ans; 
				while (ll<rr) {
					rk=1;
					int mid=ll+rr>>1;
					for (int i=l;i<=R[pos[l]];i++) {
						if (a[i]+mk[pos[l]]<=mid) rk++;
					}
					for (int i=L[pos[r]];i<=r;i++) {
						if (a[i]+mk[pos[r]]<=mid) rk++;
					}
					for (int i=pos[l]+1;i<=pos[r]-1;i++) {
						int w1=merge(L[i],R[i],mid);
						rk+=w1-L[i]+1;
//						printf ("%lld %lld %lld %lld\n",w1,cl[w1],mk[i],mid);
					}
//					printf ("%lld %lld %lld\n",mid,rk,rk2);
					if (rk>=x) {
						ans=mid;
						rr=mid-1;
					}
					else {
						ll=mid+1;
					}
				}
				printf ("%lld\n",ans);
			}
		}
	}
	return 0;
}
/*
10 3
4 2 2 4 5 3 8 3 5 7
1 3 10 2
2 3 10 2
1 3 10 2
*/
2022/10/9 19:55
加载中...