如果有人调出来,我当场叫他爸爸
查看原帖
如果有人调出来,我当场叫他爸爸
1246385
kkkkkkkkssaijei楼主2024/7/8 22:11
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
	int len=0,k1=x,c[10005];
	if(k1<0)k1=-k1,putchar('-');
	while(k1)c[len++]=k1%10+'0',k1/=10;
	while(len--)putchar(c[len]);
}
const int N=5e5+10,inf=2147483627;
int a[N];
struct SGT{
	int mx[N<<2],mx2[N<<2],mn[N<<2],mn2[N<<2],smx[N>>2],smn[N>>2];
	int add[N<<2],tr[N<<2],tmx[N<<2],tmn[N<<2];
	int ls(int p){return p<<1;}
	int rs(int p){return p<<1|1;}
	void push_up(int p){
		tr[p]=tr[ls(p)]+tr[rs(p)];
		if(mx[ls(p)]==mx[rs(p)]){
    		mx[p]=mx[ls(p)],smx[p]=smx[ls(p)]+smx[rs(p)];
    		mx2[p]=max(mx2[ls(p)],mx2[rs(p)]);
  		}
  		else if(mx[ls(p)]>mx[rs(p)]){
    		mx[p]=mx[ls(p)],smx[p]=smx[ls(p)];
    		mx2[p]=max(mx2[ls(p)],mx[rs(p)]);
  		}
  		else{
    		mx[p]=mx[rs(p)],smx[p]=smx[rs(p)];
    		mx2[p]=max(mx2[rs(p)],mx[ls(p)]);
  		}
  		if(mn[ls(p)]==mn[rs(p)]){
    		mn[p]=mn[ls(p)],smn[p]=smn[ls(p)]+smn[rs(p)];
    		mn2[p]=min(mn2[ls(p)],mn2[rs(p)]);
  		}
  		else if(mn[ls(p)]<mn[rs(p)]){
    		mn[p]=mn[ls(p)],smn[p]=smn[ls(p)];
    		mn2[p]=min(mn2[ls(p)],mn[rs(p)]);
  		}
  		else{
    		mn[p]=mn[rs(p)],smn[p]=smn[rs(p)];
    		mn2[p]=min(mn2[rs(p)],mn[ls(p)]);
  		}
	}
	void build(int p,int pl,int pr){
		tmn[p]=inf,tmx[p]=INT_MIN;
		if(pl==pr){
			tr[p]=mn[p]=mx[p]=a[pl];
			mn2[p]=inf,mx2[p]=INT_MIN;
			smx[p]=smn[p]=1;
			return ;
		}
		int mid=(pl+pr)>>1;
		build(ls(p),pl,mid);
		build(rs(p),mid+1,pr);
		push_up(p);
	}
	void add_tag(int p,int pl,int pr,int d){
		mx[p]+=d,mn[p]+=d,add[p]+=d;
		tr[p]+=d*(pr-pl+1);
		if(mx2[p]!=-inf)mx2[p]+=d;
		if(mn2[p]!=inf)mn2[p]+=d;
		if(tmn[p]!=inf)tmn[p]+=d;
		if(tmx[p]!=-inf)tmx[p]+=d; 
	}
	void max_tag(int p,int d){
		if(mn[p]>d)return ;
		tr[p]+=(d-mn[p])*smn[p];
		if(mx[p]==mn[p])mx[p]=d;
		if(mx2[p]==mn[p])mx2[p]=d;
		if(tmn[p]<d)tmn[p]=d;
		mn[p]=d,tmx[p]=d;
	}
	void min_tag(int p,int d){
		if(mx[p]<=d)return ;
		tr[p]+=(d-mx[p])*smx[p];
		if(mn[p]==mx[p])mn[p]=d;
		if(mn2[p]==mx[p])mn2[p]=d;
		if(tmx[p]>d)tmx[p]=d;
		mx[p]=d,tmn[p]=d;
	}  
	void push_down(int p,int pl,int pr){
		if(add[p]){
			int mid=(pl+pr)>>1;
			add_tag(ls(p),pl,mid,add[p]);
			add_tag(rs(p),mid+1,pr,add[p]);
			add[p]=0;
		}
		if(tmx[p]!=-inf){
			max_tag(ls(p),tmx[p]);
			max_tag(rs(p),tmx[p]);
			tmx[p]=-inf;
		}
		if(tmn[p]!=inf){
			min_tag(ls(p),tmn[p]);
			min_tag(rs(p),tmn[p]);
			tmn[p]=inf;
		}
	}
	void Add(int l,int r,int p,int pl,int pr,int d){
		if(l<=pl&&pr<=r){
			add_tag(p,pl,pr,d);
			return ;
		}
		int mid=(pl+pr)>>1;
		push_down(p,pl,pr);
		if(l<=mid)Add(l,r,ls(p),pl,mid,d);
		if(r>mid)Add(l,r,rs(p),mid+1,pr,d);
		push_up(p);
	}
	void Mmax(int l,int r,int p,int pl,int pr,int d){
		if(mn[p]>=d)return ;
		if(l<=pl&&pr<=r&&mn2[p]>d){
			max_tag(p,d);
			return ;
		}
		int mid=(pl+pr)>>1;
		push_down(p,pl,pr);
		if(l<=mid)Mmax(l,r,ls(p),pl,mid,d);
		if(r>mid)Mmax(l,r,rs(p),mid+1,pr,d);
		push_up(p);
	}
	void Mmin(int l,int r,int p,int pl,int pr,int d){
		if(mx[p]<=d)return ;
		if(l<=pl&&pr<=r&&mx2[p]<d){
			min_tag(p,d);
			return ;
		}
		int mid=(pl+pr)>>1;
		push_down(p,pl,pr);
		if(l<=mid)Mmin(l,r,ls(p),pl,mid,d);
		if(r>mid)Mmin(l,r,rs(p),mid+1,pr,d);
		push_up(p);
	}
	int Qsum(int l,int r,int p,int pl,int pr){
		if(l<=pl&&pr<=r)return tr[p];
		push_down(p,pl,pr);
		int res=0,mid=(pl+pr)>>1;
		if(l<=mid)res+=Qsum(l,r,ls(p),pl,mid);
		if(r>mid)res+=Qsum(l,r,rs(p),mid+1,pr);
		return res;
	}
	int Qmax(int l,int r,int p,int pl,int pr){
		if(l<=pl&&pr<=r)return mx[p];
		push_down(p,pl,pr);
		int res=-inf,mid=(pl+pr)>>1;
		if(l<=mid)res=max(Qmax(l,r,ls(p),pl,mid),res);
		if(r>mid)res=max(Qmax(l,r,rs(p),mid+1,pr),res);
		return res;
	}
	int Qmin(int l,int r,int p,int pl,int pr){
		if(l<=pl&&pr<=r)return mn[p];
		push_down(p,pl,pr);
		int res=inf,mid=(pl+pr)>>1;
		if(l<=mid)res=min(Qmin(l,r,ls(p),pl,mid),res);
		if(r>mid)res=min(Qmin(l,r,rs(p),mid+1,pr),res);
		return res;
	}
}sgt;
signed main(){
	int n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	sgt.build(1,1,n);
	int m=read();
	while(m--){
		int op=read(),l=read(),r=read();
		if(op==1){
			int x=read();
			sgt.Add(l,r,1,1,n,x);
		}
		else if(op==2){
			int x=read();
			sgt.Mmax(l,r,1,1,n,x);
		}
		else if(op==3){
			int x=read();
			sgt.Mmin(l,r,1,1,n,x);
		}
		else if(op==4)write(sgt.Qsum(l,r,1,1,n)),puts("");
		else if(op==5)write(sgt.Qmax(l,r,1,1,n)),puts("");
		else write(sgt.Qmin(l,r,1,1,n)),puts("");
	}
	return 0;
}

2024/7/8 22:11
加载中...