60p求条
查看原帖
60p求条
1117264
zzm1118楼主2025/7/27 10:45

7-10wa

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstdlib>
#include<string>
#include<cstring>
#include<set>
#include<vector>
#include<utility>
#include<stack>
#include<list>
#include<queue>
#include<climits>
#include<tuple>
using namespace std;
#define int long long
#define pii pair<int,int>
#define l(x) x&(-x)
#define lch 2*now
#define rch 2*now+1
#define mid (p[now].r+p[now].l>>1)
int ai[1000010];
struct tree{
	int sum,l,r,add,upd;
}p[8000010];
void push_up(int now){p[now].sum=max(p[lch].sum,p[rch].sum);}
void push_down(int now){
	p[lch].sum=(p[now].upd==1145141919810ll?p[lch].sum:p[now].upd)+p[now].add;
	p[rch].sum=(p[now].upd==1145141919810ll?p[rch].sum:p[now].upd)+p[now].add;
	p[lch].add+=p[now].add;
	p[rch].add+=p[now].add;
	if(p[now].upd!=1145141919810ll)p[lch].upd=p[rch].upd=p[now].upd;
	p[now].add=0;p[now].upd=1145141919810ll;
}
void build(int now,int l,int r){
	if(p[now]={ai[l],l,r,0,1145141919810ll},l==r)return;
	build(2*now,l,mid);build(2*now+1,mid+1,r);push_up(now);
}
void update(int o,int now,int l,int r,int t){
	if(p[now].l>=l&&r>=p[now].r){
		if(o==1){
			p[now].sum=t;
			if(p[now].add!=0)p[now].add=0;
			p[now].upd=t;
		}else{
			p[now].sum+=t;
			p[now].add+=t;
		}
		return;
	}
	push_down(now);
	if(l<=mid)update(o,lch,l,r,t);if(r>mid)update(o,rch,l,r,t);
	push_up(now);
}
int query(int now,int l,int r){
	push_down(now);
	if(p[now].l>=l&&r>=p[now].r)return p[now].sum;
	int ans=LLONG_MIN;
	push_up(now);
	if(l<=mid)ans=max(ans,query(lch,l,r));if(r>mid)ans=max(ans,query(rch,l,r));
	return ans;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int x=1;x<=n;x++){
		cin>>ai[x];
	}build(1,1,n);
	for(int x=1;x<=m;x++){
		int o,a,b,c;
		cin>>o>>a>>b;
		if(o!=3){
			cin>>c;
			update(o,1,a,b,c);
		} else cout<<query(1,a,b)<<endl;
	}
	return 0;
}

2025/7/27 10:45
加载中...