50分求调,玄关
查看原帖
50分求调,玄关
761972
_Winham_楼主2025/8/3 21:39
#include<iostream>
#include<string>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<iomanip>
#include<cstdio>
#include<queue>
#include <climits>
#include<stack>
#include<deque>
using namespace std;
#define int long long
const int N = 1e7+10;
const int INF = LONG_MIN;
#define ls id<<1
#define rs id<<1|1
int a[N],n,m;
struct node{
	int l,r,sum,lazy;
	int clazy;
}tr[N];
void push_up(int id){
	tr[id].sum=max(tr[ls].sum,tr[rs].sum);
}
void push_down(int id){
	if(tr[id].lazy!=0){
		tr[ls].sum+=tr[id].lazy;
		tr[rs].sum+=tr[id].lazy;
		tr[ls].lazy+=tr[id].lazy,tr[rs].lazy+=tr[id].lazy;
		tr[id].lazy=0;
	}

	if(tr[id].clazy!=INF){
		tr[ls].sum=tr[id].clazy;
		tr[rs].sum=tr[id].clazy;
		tr[ls].clazy=tr[id].clazy,tr[rs].clazy=tr[id].clazy;
		tr[id].clazy=INF;
		tr[id].lazy=0;
	}
}
void build(int id,int l,int r){
	tr[id].l=l,tr[id].r=r;
	tr[id].lazy=0,tr[id].sum=0,tr[id].clazy=INF;
	if(l==r){
		tr[id].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(id);
}
void change(int id,int l,int r,int k){
	if(tr[id].l>r||tr[id].r<l)return ;
	if(tr[id].l>=l&&tr[id].r<=r){
		tr[id].sum=k;
		tr[id].lazy=0;
		tr[id].clazy=k;
		return ;
	}
	if(tr[id].lazy!=0||tr[id].clazy!=INF)push_down(id);
	change(ls,l,r,k);
	change(rs,l,r,k);
	push_up(id);
} 
void add(int id,int l,int r,int k){
	if(tr[id].l>r||tr[id].r<l)return ;
	if(tr[id].l>=l&&tr[id].r<=r){
		tr[id].sum+=k;
		tr[id].lazy+=k;
		return ;
	}
	if(tr[id].lazy||tr[id].clazy!=INF)push_down(id);
	add(ls,l,r,k);
	add(rs,l,r,k);
	push_up(id);
}
int calc(int id,int l,int r){
	if(tr[id].l>r||tr[id].r<l)return INF;
	if(tr[id].l>=l&&tr[id].r<=r){ return tr[id].sum; }
	if(tr[id].lazy!=0||tr[id].clazy!=INF)push_down(id);
	return max(calc(ls,l,r),calc(rs,l,r)); 
}
signed main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
		int opt,x,y,z;
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>z;
			change(1,x,y,z);
		} 
		else if(opt==2){
			cin>>z;
			add(1,x,y,z);
		}
		else {
			cout<<calc(1,x,y)<<endl;
		}
	}
	
	return 0;
}

玄关

2025/8/3 21:39
加载中...