20分求助
查看原帖
20分求助
572482
Dream_weavers楼主2022/4/10 21:25

#1、3AC,其余全WA link 求助QAQ

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f3f;
int n,m,op,l,r,a[N],d;
int t[N<<2],tag[N<<2],mdf[N<<2];

inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}

inline void pushup(int x){
	t[x]=max(t[lc(x)],t[rc(x)]); 
}

inline void pushdown(int x){
	tag[lc(x)]+=tag[x],t[lc(x)]+=tag[x];
	tag[rc(x)]+=tag[x],t[rc(x)]+=tag[x];
	tag[x]=0;
	if(mdf[x]!=INF){
		t[lc(x)]=mdf[lc(x)]=mdf[x],tag[lc(x)]=0;
		t[rc(x)]=mdf[rc(x)]=mdf[x],tag[rc(x)]=0;
		mdf[x]=INF;
	}
}

void bulid(int l,int r,int x){
	mdf[x]=INF;
	if(l==r){
		t[x]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	bulid(l,mid,lc(x));
	bulid(mid+1,r,rc(x));
	pushup(x);
}

void update(int L,int R,int l,int r,int x,int d){
	if(l>=L&&r<=R){
		t[x]=mdf[x]=d;
		tag[x]=0;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
    if(L<=mid) update(L,R,l,mid,lc(x),d);
    if(mid+1<=R) update(L,R,mid+1,r,rc(x),d);  
    pushup(x);
} 

void add(int L,int R,int l,int r,int x,int d){
	if(l>=L&&r<=R){
		t[x]+=d,tag[x]+=d;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
    if(L<=mid) update(L,R,l,mid,lc(x),d);
    if(mid<R) update(L,R,mid+1,r,rc(x),d);  
    pushup(x);
} 

int query(int L,int R,int l,int r,int x){
	if(l>=L&&r<=R)return t[x];
	pushdown(x);
	int mid=(r+l)>>1;
	int ans=-INF;
	if(L<=mid) ans=max(ans,query(L,R,l,mid,lc(x)));
    if(mid<R) ans=max(ans,query(L,R,mid+1,r,rc(x)));
    return ans;
}

signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	bulid(1,n,1);
	while(m--){
		scanf("%lld%lld%lld",&op,&l,&r);
		if(op==1){
			scanf("%lld",&d);
			update(l,r,1,n,1,d);	
		}else if(op==2){
			scanf("%lld",&d);
			add(l,r,1,n,1,d);
		}else{
			printf("%lld\n",query(l,r,1,n,1)); 
		}
	}
	return 0;
}

2022/4/10 21:25
加载中...