10分求条
查看原帖
10分求条
1248813
_ByTT_楼主2025/1/14 14:54

求条,给关

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct Tree{
	int l,r,sum,lz1,lz2,flg;
}tr[4000005];
void build(int p,int l,int r){
	tr[p].l=l;tr[p].r=r;tr[p].sum=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(p<<1,l,mid);build((p<<1)+1,mid+1,r);
}
void uplz(int p,int lz1,int lz2,int flg){
	if(flg==1){
		tr[p].sum=lz1;
		tr[p].lz2=lz2;
		tr[p].lz1=0;
		tr[p].flg=flg;
	}
	tr[p].sum+=lz1;
	tr[p].lz1+=lz1;
}
void pushdown(int p){
	if(tr[p].lz1!=0||tr[p].flg!=0){
		uplz(p<<1,tr[p].lz1,tr[p].lz2,tr[p].flg);
		uplz((p<<1)+1,tr[p].lz1,tr[p].lz2,tr[p].flg);
		tr[p].lz1=tr[p].lz2=tr[p].flg=0;
	}
}
void modify(int p,int l,int r,int b){
	if(tr[p].l>r||tr[p].r<l) return;
	if(tr[p].l>=l&&tr[p].r<=r){
		uplz(p,tr[p].l,tr[p].r,b);
		return;
	}
	pushdown(p);
	modify(p<<1,l,r,b);
	modify((p<<1)+1,l,r,b);
	tr[p].sum=max(tr[p<<1].sum,tr[(p<<1)+1].sum);
}
void modify2(int p,int a,int b,int x){
	if(tr[p].l>a||tr[p].r<b) return;
	if(tr[p].l>=a&&tr[p].r<=b){
		tr[p].sum=x;return;
	}
	modify2(p<<1,a,b,x);
	modify2((p<<1)+1,a,b,x);
	tr[p].sum=max(tr[p<<1].sum,tr[(p<<1)+1].sum);
}
int query(int p,int a,int b){
	if(tr[p].l>b||tr[p].r<a) return 0;
	if(tr[p].l>=a&&tr[p].r<=b) return tr[p].sum;
	int sum=0;
	pushdown(p);
	sum=max(sum,query(p<<1,a,b));
	sum=max(sum,query((p<<1)+1,a,b));
	return sum;
}
signed main(){
	int n,m;cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=n;i++){
		int a;cin>>a;
		modify2(1,i,i,a);
		cout<<"MAX="<<query(1,1,i)<<' ';
	}
	cout<<'\n';
	while(m--){
		int opt,x,y,k;cin>>opt;
		if(opt==1){
			cin>>x>>y>>k;
			modify(1,x,y,k);
			cout<<"MAX="<<query(1,1,n)<<'\n';
		}
		if(opt==2){
			cin>>x>>y>>k;
			modify(1,x,y,k);
			cout<<"MAX="<<query(1,1,n)<<'\n';
		}
		if(opt==3){
			cin>>x>>y;
			cout<<query(1,x,y)<<'\n';
		}
	}
	return 0; 
}
2025/1/14 14:54
加载中...