这玩意有希望卡过subtask3嘛(
查看原帖
这玩意有希望卡过subtask3嘛(
253765
houpingze楼主2021/3/25 16:33

rt(

#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
//#define int long long 
#define max(n,m) (n>m?n:m)
#define min(n,m) (n<m?n:m)
#define register   register int
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 
using namespace std;

const int inf=1e9;
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
inline int read(){
    int res=0,fs=1; char c=getchar();
    while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
    while(c>='0' && c<='9')res=res*10+(c^48),c=getchar();
    return res*fs;
//	int x;
//	cin>>x;
//	return x;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}

long long lastans=0;
int S;
long long lazy[1005]; 
int n,cnt,m,a[500005],ans,tmp,l,r,k,z,x[500005],y[500005],id[500005],mx[1005],mn[1005];
long long v[1005];
inline void update(int l,int r,int k){  
	
    int ll=id[l],rr=id[r]; 
    if(ll==rr){  
    	if(mx[ll]-lazy[ll]<=k){
    		return ;
		}
    	for(register  i=l;i<=r;i++){
    		if(a[i]-lazy[ll]>k) a[i]-=k; 
		} 
		mx[ll]=0,mn[ll]=INF,v[ll]=0;
		for(register  i=x[ll];i<=y[ll];i++){
			a[i]-=lazy[ll];
			mx[ll]=max(mx[ll],a[i]);
			mn[ll]=min(mn[ll],a[i]); 
			v[ll]+=a[i];
		}
		lazy[ll]=0;
		return ;
	}
	
    	for(register  i=l;i<=y[ll];i++){
    		if(a[i]-lazy[ll]>k) a[i]-=k; 
		}
		
		mx[ll]=0,mn[ll]=INF,v[ll]=0;
		for(register  i=x[ll];i<=y[ll];i++){
			a[i]-=lazy[ll];
			mx[ll]=max(mx[ll],a[i]);
			mn[ll]=min(mn[ll],a[i]); 
			v[ll]+=a[i];
		}
		lazy[ll]=0;
		
    	for(register  i=x[rr];i<=r;i++){
    		if(a[i]-lazy[rr]>k) a[i]-=k; 
		}
		mx[rr]=0,mn[rr]=INF,v[rr]=0;
		for(register  i=x[rr];i<=y[rr];i++){
    		a[i]-=lazy[rr]; 
			mx[rr]=max(mx[rr],a[i]);
			mn[rr]=min(mn[rr],a[i]); 
			v[rr]+=a[i];
		}
		lazy[rr]=0;
		for(int i=ll+1;i<rr;i++){
			if(mx[i]-lazy[i]<=k){
				continue;
			}
			if(mn[i]-lazy[i]>k){
				lazy[i]+=k;
				continue;
			}
			for(register  j=x[i];j<=y[i];j++){
				if(a[j]-lazy[i]>k) a[j]-=lazy[i]+k; 
	    		else a[j]-=lazy[i];
			}
			mx[i]=0,mn[i]=INF,v[i]=0;
			for(register  j=x[i];j<=y[i];j++){
				mx[i]=max(mx[i],a[j]);
				mn[i]=min(mn[i],a[j]); 
				v[i]+=a[j];
			}
			lazy[i]=0;
		}
}
inline void query(int l,int r){ 
    int ll=id[l],rr=id[r]; 
    int mxr=0,mnr=INF;
	long long ans=0;
    if(ll==rr){
    	for(register  i=l;i<=r;i++){
    		mxr=max(mxr,a[i]-lazy[ll]);
    		mnr=min(mnr,a[i]-lazy[ll]);
    		ans+=a[i]-lazy[ll];
		}
		
    	cout<<ans<<' '<<mnr<<' '<<mxr<<'\n';
    	lastans=ans%1048576;
		return ;
	}
    for(register  i=l;i<=y[ll];i++) mxr=max(mxr,a[i]-lazy[ll]),mnr=min(mnr,a[i]-lazy[ll]),ans+=a[i]-lazy[ll];
    for(register  i=x[rr];i<=r;i++) mxr=max(mxr,a[i]-lazy[rr]),mnr=min(mnr,a[i]-lazy[rr]),ans+=a[i]-lazy[rr];
    for(register  i=ll+1;i<rr;i++){
    	mxr=max(mxr,mx[i]-lazy[i]);
    	mnr=min(mnr,mn[i]-lazy[i]);
    	ans+=v[i]-lazy[i]*(y[i]-x[i]+1); 
	}
    cout<<ans<<' '<<mnr<<' '<<mxr<<'\n';
    lastans=ans%1048576;
    return ;
}
signed main() { 
    cin>>n>>m;  
    for(int i=1;i<=n;i++) a[i]=read();
    S=sqrt(n); 
    for(int i=1;i<=S;i++){
        x[i]=(i-1)*S+1,y[i]=min(i*S,n);
    } 
    if(x[S]<n) S++,x[S]=y[S-1]+1,y[S]=n; 
    for(int i=1;i<=S;i++){ 
    	mn[i]=INF;
        for(int j=x[i];j<=y[i];j++){
        	id[j]=i;
        	mn[i]=min(mn[i],a[j]);
        	mx[i]=max(mx[i],a[j]);
        	v[i]+=a[j];
		} 
    } 
    while(m--){
        int op=read(); 
        if(op==1){
        	int l=read()^lastans,r=read()^lastans,x=read()^lastans;
        
        	update(l,r,x);
		}else{
			int l=read()^lastans,r=read()^lastans; 
			 
			query(l,r);
		}
    }
    return 0;
}

或者谁能给个超级快读啊((((thx(((((((

2021/3/25 16:33
加载中...