求调20
查看原帖
求调20
186546
lwyznoip楼主2024/7/11 20:44
#include <bits/stdc++.h> 
#define lc id << 1
#define rc id << 1 | 1
#define int long long

using namespace std;

int n, m;
struct node{
	
	int l, r;
	int add, cov;
	int maxx;
	
} tr[4000005];

void pushdown (int id){
	
	tr[id].maxx = max (tr[lc].maxx, tr[rc].maxx);
	
}

void build (int id, int x, int y){
	
	tr[id].l = x;
	tr[id].r = y;
	tr[id].cov = 0x3f3f3f3f;
	tr[id].add = 0;
	
	if (x == y) {
		
		cin >> tr[id].maxx;
		return;
		
	}
	
	int mid =  (x + y) / 2;
	
	build (lc, x, mid);
	build (rc, mid + 1, y);
	
	pushdown (id);
	
}
void pushup (int id){
	
	if (tr[id].cov != 0x3f3f3f3f){
		
		tr[lc].cov = tr[id].cov;
		tr[rc].cov = tr[id].cov;
		tr[lc].maxx = tr[id].cov;
		tr[rc].maxx = tr[id].cov;
		tr[lc].add = tr[id].cov;
		tr[rc].add = tr[id].cov;
		tr[id].cov = 0x3f3f3f3f;
		
	}
	
	if (tr[id].add){
        
        tr[lc].maxx += tr[id].add;
        tr[rc].maxx += tr[id].add;
        tr[lc].add += tr[id].add;
        tr[rc].add += tr[id].add;
        tr[id].add = 0;
        
    }
	
}

void covv (int id, int x, int y, int k){
	
	if (x > tr[id].r || y < tr[id].l) return;
    
    if (x <= tr[id].l && tr[id].r <= y){
        
        tr[id].maxx = k;
        tr[id].cov = k;
        tr[id].add = k;
        return;
        
    }
    
    pushdown (id);
    covv (lc, x, y, k);
    covv (rc, x, y, k);
    pushup (id);
	
}

void addd (int id, int x, int y, int k){
	
	if (x > tr[id].r || y < tr[id].l) return;
    
    if (x <= tr[id].l && tr[id].r <= y){
        
        tr[id].maxx += k;
        tr[id].add += k;
        return;
        
    }
    
    pushdown (id);
    addd (lc, x, y, k);
    addd (rc, x, y, k);
    pushup (id);
	
}

int query (int id, int x, int y){
    
    if (x > tr[id].r || y < tr[id].l) return 0;
    
    if (x <= tr[id].l && tr[id].r <= y){
        
        return tr[id].maxx;
        
    }
    pushdown (id);
    return max (query (lc, x, y), query(rc, x, y));
    
}

signed main(){
    
    cin >> n >> m;
    
    build (1, 1, n);
    
    while (m --){
    	
    	int op, x, y, k;
    	cin >> op >> x >> y;
    	
    	if (op == 1){
    		
    		cin >> k;
    		covv (1, x, y, k);
    		
		}
		
		if (op == 2){
			
			cin >> k;
			addd (1, x, y, k);
			
		}
		
		if (op == 3){
			
			cout << query (1, x, y) << endl;
			
		}
    	
	}
    
}
2024/7/11 20:44
加载中...