求助萌新不会卡常
查看原帖
求助萌新不会卡常
1220111
xiaoyang222楼主2024/7/25 13:01

T30pts

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int SIZE=(1<<20)+1;
char buf[SIZE],*p1=buf,*p2=buf;
char buffer[SIZE];
int op1=-1;
const int op2=SIZE-1;
inline char readchar() {
	if(p1!=p2) {
		return *p1++;
	}
	return p1==(p2=(p1=buf)+fread(buf,1,SIZE-1,stdin))?EOF:*p1++;
}
inline void flush() {
	fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
	if(op1==op2) flush();
	buffer[++op1]=x;
}
inline int read() {
	int s=1,c=readchar(),x=0;
	while(c<=32) {
		c=readchar();
	}
	if(c=='-') {
		s=-1,c=readchar();
	}
	for(; ('0'<=c && c<='9'); c=readchar()) {
		x=x*10+c-'0';
	}
	return x*s;
}
inline void write(int x) {
	if(x<0) {
		writechar('-'),x=-x;
	}
	char s[25];
	int n=0;
	while(x || !n) {
		s[n++]='0'+x%10,x/=10;
	}
	while(n--) {
		writechar(s[n]);
	}
} 
const int N=1e5+5,M=1e3+5;
int k;
int n,m;
int id[N];
int a[N],tag[N];
int ku[M][M];
int sm[N];
int i,lid,rid,mid;
int op,l,r,l1,r1,cnt,qwq;
int tot[N];
inline bool check(){
	cnt=upper_bound(tot,tot+qwq,mid)-tot;
	for (i=lid+1;i<rid;++i){
		cnt+=upper_bound(ku[i],ku[i]+sm[i],mid-tag[i])-ku[i];
//		cout<<i<<" "<<upper_bound(ku[i].begin(),ku[i].end(),mid-tag[i])-ku[i].begin()<<endl;
	}
//	cout<<cnt<<endl;
	return cnt>=k;
}
signed main(){
	n=read(),m=read();
	k=sqrt(n);
	for (int i=1;i<=n;++i) id[i]=i/k;
	for (int i=1;i<=n;++i) a[i]=read(),ku[id[i]][sm[id[i]]]=a[i],++sm[id[i]];
//	for (int i=1;i<=n;++i) cout<<id[i]<<" ";
//	cout<<endl;
	k=0;
	while (sm[k]!=0) sort(ku[k],ku[k]+sm[k]),++k;
	for (int _=0;_<m;++_){
		op=read(),l=read(),r=read(),k=read();
		lid=id[l],rid=id[r];
		if (op==1){//查询
			l1=-5e9,r1=25e9,mid;//二分
			if (r-l+1<k){write(-1);writechar('\n');continue;}
			if (lid==rid || lid+1==rid){//特判,时间复杂度sqrt(n)
				for (i=l;i<=r;++i) tot[i-l]=a[i]+tag[id[i]];
				sort(tot,tot+(r-l+1));
				write(tot[k-1]);
				writechar('\n');
				continue;
			}
			qwq=0;
			for (i=l;id[i]==lid;++i,++qwq) tot[qwq]=a[i]+tag[lid];
			for (i=r;id[i]==rid;--i,++qwq) tot[qwq]=a[i]+tag[rid];
			sort(tot,tot+qwq);
			while (l1<r1){//值域二分
				mid=(l1+r1)/2;
				if (check()) r1=mid;
				else l1=mid+1;
			}
			write(l1);
			writechar('\n');
		}else{
			if (lid==rid){//特殊处理
				for (i=l;i<=r;++i) a[i]+=k;
				sm[lid]=0;
				l1=l;
				while (id[l1]==lid && l1>=1) --l1;
				++l1;
				while (id[l1]==lid && l1<=n) ku[lid][sm[lid]]=a[l1],++sm[lid],++l1;
				sort(ku[lid],ku[lid]+sm[lid]);
				continue;
			}
//			ku[lid].clear(),ku[rid].clear();
			sm[lid]=sm[rid]=0;
			l1=l;
			for (;id[l1]==lid;++l1) a[l1]+=k;
			--l1;
			for (;id[l1]==lid;--l1) ku[lid][sm[lid]]=a[l1],++sm[lid];
			r1=r;
			for (;id[r1]==rid;--r1) a[r1]+=k;
			++r1;
			for (;id[r1]==rid;++r1) ku[rid][sm[rid]]=a[r1],++sm[rid];
			sort(ku[lid],ku[lid]+sm[lid]);sort(ku[rid],ku[rid]+sm[rid]);
			for (i=lid+1;i<rid;++i) tag[i]+=k;
		}
	}
	flush();
	return 0;
}
/*
10 2
962 458 -441 -239 839 310 -747 -164 -330 -296 
2 7 7 986
1 2 9 7
*/
//10 1
//962 458 -441 -239 839 310 -747 -164 -330 -296 
//1 2 9 7
2024/7/25 13:01
加载中...