60WA求调
查看原帖
60WA求调
1264576
2010zhuanghaojun楼主2024/12/27 20:07
#include <bits/stdc++.h>
#define int long long 
#define minn -9223372036854775807
using namespace std;
struct str{
	int l,r,v,add,revise;
}tr[4000005];
int a[1000005];
void pushup(int p) {
	tr[p].v=max(tr[p<<1].v,tr[p<<1|1].v);
}
void pushdown(int p) {
	int mid=(tr[p].l+tr[p].r)>>1;
	if(tr[p].revise!=minn){
		tr[p<<1].v=tr[p].revise;
		tr[p<<1|1].v=tr[p].revise;
		tr[p<<1].revise=tr[p].revise;
		tr[p<<1|1].revise=tr[p].revise;
	}
	if(tr[p].add!=0){
		tr[p<<1].v+=tr[p].add;
		tr[p<<1|1].v+=tr[p].add;
		tr[p<<1].add+=tr[p].add;
		tr[p<<1|1].add+=tr[p].add;	
	}
	tr[p].revise=minn;
	tr[p].add=0;
}
void build(int p,int x,int y) {
	tr[p].l=x;
	tr[p].r=y;
	tr[p].revise=minn;
	tr[p].add=0;
	if(x==y){
		tr[p].v=a[x];
		return;
	}
	int mid=(x+y)>>1;
	build(p<<1,x,mid);
	build(p<<1|1,mid+1,y);
	pushup(p); 
}
void update_revise(int p,int x,int y,int k) {
	if(x<=tr[p].l&&tr[p].r<=y) {
		tr[p].v=k;
		tr[p].revise=k;
		tr[p].add=0;
		return;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(x<=mid){
		update_revise(p<<1,x,y,k);
	} 
	if(y>mid){
		update_revise(p<<1|1,x,y,k);
	}
	pushup(p);	
}
void update_add(int p,int x,int y,int k) {
	if(x<=tr[p].l&&tr[p].r<=y) {
		tr[p].v+=k;
		tr[p].add+=k;
		return;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(x<=mid){
		update_add(p<<1,x,y,k);
	} 
	if(y>mid){
		update_add(p<<1|1,x,y,k);
	}
	pushup(p);	
}
void debug(){
	for(int i=1;i<=7;i++){
		cout<<i<<" "<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].v<<endl;
	}
}
int query(int p,int x,int y) {
	if(x<=tr[p].l&&tr[p].r<=y){
		return tr[p].v;
	} 
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	int maxn=minn;
	if(x<=mid){
		maxn=max(maxn,query(p<<1,x,y));
	} 
	if(y>mid){
		maxn=max(maxn,query(p<<1|1,x,y));
	}
	return maxn;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	int n,m;
	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 f;
		cin>>f;
		if(f==1){
			int x,y,k;
			cin>>x>>y>>k;
			update_revise(1,x,y,k);
		} 
		if(f==2){
			int x,y,k;
			cin>>x>>y>>k;
			update_add(1,x,y,k);
		}
		if(f==3){
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<"\n";
		}
		//debug();
	}
}
2024/12/27 20:07
加载中...