没过样例求助
查看原帖
没过样例求助
550957
Anonymely楼主2022/7/3 09:06
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=200005;
const int inf=1e18;

int n,m;
int a[N];
struct tree{
	int l,r;
	int sum;
	int tag1=inf,tag2;
}t[N<<2];

int lson(int p){return p<<1;}
int rson(int p){return (p<<1)|1;}
int md(int l,int r){return (l+r)>>1;}
void pushup(int p){
	t[p].sum=max(t[lson(p)].sum,t[rson(p)].sum);
}

void make_tag1(int p,int k){
	t[p].sum=k;
	t[p].tag1=k;
	t[p].tag2=0;
}

void make_tag2(int p,int k){
	t[p].sum+=k;
	if(t[p].tag1!=inf)t[p].tag1+=k;
	else t[p].tag2+=k;
}

void pushdown(int p){
	if(t[p].tag1!=inf){
		make_tag1(lson(p),t[p].tag1);
		make_tag1(rson(p),t[p].tag1); 
		t[p].tag1=inf;
	}else if(t[p].tag2){
		make_tag2(lson(p),t[p].tag2);
		make_tag2(rson(p),t[p].tag2);
		t[p].tag2=0;	
	}
}

void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=a[l];return ;
	}
	int mid=md(l,r);
	build(lson(p),l,mid);
	build(rson(p),mid+1,r);
	pushup(p);
}

void update(int p,int l,int r,int op,int k){
	if(l<=t[p].l&&t[p].r<=r){
		if(op==1)make_tag1(p,k);
		else make_tag2(p,k);
		return ;
	}
	int mid=md(t[p].l,t[p].r);
	pushdown(p);
	if(l<=mid)update(lson(p),l,r,op,k);
	if(r>mid)update(rson(p),l,r,op,k);
	pushup(p);
}

int query(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r){
		return t[p].sum;
	}
	pushdown(p);
	int ans=-inf;
	int mid=md(t[p].l,t[p].r);
	if(l<=mid)ans=max(ans,query(lson(p),l,r));
	if(r>mid)ans=max(ans,query(rson(p),l,r));
	return ans;
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,l,r;cin>>op>>l>>r;
		if(op==1){
			int x;cin>>x;
			update(1,l,r,x,1);
		}else if(op==2){
			int x;cin>>x;
			update(1,l,r,x,2);
		}else{
			cout<<query(1,l,r)<<endl;
		}
	}
	return 0;
}

麻了,没过样例

2022/7/3 09:06
加载中...