蒟蒻全RE求助
查看原帖
蒟蒻全RE求助
135258
charm1楼主2021/4/30 11:54

RT

#include <bits/stdc++.h>
using namespace std;
const int maxn=110005;
const int maxm=405;
int n,m,block;
int a[maxn],p[maxm][maxm],tag[maxn],pos[maxn],L[maxm],R[maxm];
struct nod{
	int pos,val;
}sav[maxn];
inline bool cmp(nod x,nod y){return x.val<y.val;}
inline int read(){
	int ret=0,f=1;	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
int check(int val,int l,int r){
	int sum=0;
	if(pos[l]==pos[r]){
		for(int k=l;k<=r;k++)	sum+=(a[k]<=val);
		return sum;
	}
	int rr=R[pos[l]],ll=L[pos[r]],tl=tag[pos[l]],tr=tag[pos[r]];
	for(int k=l;k<=rr;k++)  sum+=(a[k]<=val-tl);
	for(int k=ll;k<=r;k++)  sum+=(a[k]<=val-tr);
//	if(val<=10)	cout<<"val= "<<val<<" "<<sum<<endl;
	for(int k=pos[l]+1;k<=pos[r]-1;k++){
		int l=0,r=block,ans=0,w=val-tag[k];
		while(l<r){
			int mid=l+r+1>>1;
			if(a[p[k][mid]]<=w)  l=mid;
			else    r=mid-1;
		}
		sum+=l;
//		if(val<=10) cout<<l<<" "<<k<<endl;
	}
//	if(val<=10)	cout<<"sum= "<<sum<<endl;
	return sum;
}
void merge(int l,int r){
	int q=pos[l];   int x,y,now;
	for(x=1,y=1,now=0;x<=block&&y<=block;){
		while(p[q][x]< l||p[q][x]> r&&x<=block) ++x;
		while(p[q][y]>=l&&p[q][y]<=r&&y<=block) ++y;
		if(x>block||y>block)    break;
		if(a[p[q][x]]<a[p[q][y]])
		sav[++now].val=p[q][x++];
		else
		sav[++now].val=p[q][y++];
	}
	while(x<=block){
		while(p[q][x]<l||p[q][x]>r) 	++x;
		sav[++now].val=p[q][x++];
	}
	while(y<=block){
		while(p[q][y]>=l&&p[q][y]<=r)   ++y;
		sav[++now].val=p[q][y++];
	}
	for(int k=1;k<=block;k++) p[q][k]=sav[k].val;
}
void prework(){
	for(int k=1;k<=n;k++)	pos[k]=(k-1)/block+1;
	for(int k=1;k<=pos[n];k++){
		int r=k*block,l=r-block+1;
		L[k]=l;	R[k]=r;
		for(int j=l;j<=r;j++)
		sav[j].val=a[j],
		sav[j].pos=j;
		sort(sav+l,sav+r+1,cmp);
		for(int j=l;j<=r;j++)
		p[k][j-l+1]=sav[j].pos;
	}
}
void solve(){
	for(int k=1;k<=m;k++){
		int opt,l,r,val;
		opt=read(); l=read();   r=read();   val=read();
		if(opt==1){
			int ll=-(int)(2e9),rr=(int)(2e9);
			while(ll<rr){
				int mid=ll+rr>>1;
//				cout<<l<<" "<<r<<" "<<mid<<" "<<ll<<" "<<rr<<endl;
				if(check(mid,l,r)<val)  ll=mid+1;
				else    rr=mid;
				
			}
			if(k%10000==0)
			if(abs(ll)==(int)(2e9))    puts("-1");
			else	printf("%d\n",ll);
		}
		else{
			if(pos[l]==pos[r]){
				for(int k=l;k<=r;k++)   a[k]+=val;
				merge(l,r);
			}
			else{
				int ll=L[pos[r]],rr=R[pos[l]];
				for(int k=l;k<=rr;k++)  a[k]+=val;
				for(int k=ll;k<=r;k++)  a[k]+=val;
				merge(l,rr);    merge(ll,r);
				for(int k=pos[l]+1;k<=pos[r]-1;k++) tag[k]+=val;
			}
		}
//		for(int j=1;j<=pos[n];j++)  cout<<p[j][1]<<" "<<p[j][2]<<" ";
//		cout<<endl;
//		for(int j=1;j<=n;j++)   cout<<a[j]+tag[pos[j]]<<" ";
//		cout<<endl;
	}
}
signed main(){
	freopen("1.in","r",stdin);
	n=read();   m=read();   block=sqrt(n);
	for(int k=1;k<=n;k++)	a[k]=read();
	prework();  solve();
	return 0;
}
2021/4/30 11:54
加载中...