求调
查看原帖
求调
1409169
MXN1001楼主2025/1/25 20:29

代码只有90,wa了第三个点

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
#define int long long
inline int read(){
	char ch = getchar();
	while(ch < '0' || ch > '9') ch = getchar();
	int num = 0;
	while(ch >= '0' && ch <= '9'){
		num = (num << 3) + (num << 1) + ch - '0';
		ch = getchar();
	}
	return num;
}
int n , q , tree[maxn << 2] , lazy[maxn << 2][2] , a[maxn];
#define lc rt << 1
#define rc rt << 1 | 1
#define lson lc , l , mid
#define rson rc , mid + 1 , r
#define Ql lson , ql , qr
#define Qr rson , ql , qr
#define half (l + r) >> 1
#define myself rt , l , r
void pushup(int rt){
	tree[rt] = max(tree[lc] , tree[rc]);
}
void build(int rt , int l , int r){
	lazy[rt][1] = lazy[rt][0] = 0;
	if(l == r){
		tree[rt] = a[l];
		//printf("%d  --  %d\n" , rt , a[l]);
		return;
	}
	int mid = half;
	build(lson);
	build(rson);
	pushup(rt);
}
void pushdown(int rt , int l , int r){
	if(lazy[rt][1]) {
		tree[lc] = lazy[rt][1];
		tree[rc] = lazy[rt][1];
		lazy[lc][1] = lazy[rt][1];
		lazy[lc][0] = 0;
		lazy[rc][1] = lazy[rt][1];
		lazy[rc][0] = 0;
		lazy[rt][1] = 0;
	}
	if(lazy[rt][0]){
		tree[lc] += lazy[rt][0];
		tree[rc] += lazy[rt][0];
		lazy[lc][0] += lazy[rt][0];
		lazy[rc][0] += lazy[rt][0];
		lazy[rt][0] = 0;
	}
}
void update(int rt , int l , int r , int ql , int qr , int op , int val){
	if(ql <= l && qr >= r){
		if(op == 1){
			lazy[rt][1] = val;
			lazy[rt][0] = 0;
			tree[rt] = val;
		}
		else {
			lazy[rt][0] += val;
			tree[rt] += val;
		}
		return ;
	}
	int mid = half;
	pushdown(myself);
	if(ql > mid) update(Qr , op , val);
	else if(qr <= mid) update(Ql , op , val);
	else {
		update(Qr , op , val);
		update(Ql , op , val);
	}
	pushup(rt);
} 
int query(int rt , int l , int r , int ql , int qr){
	if(ql <= l && qr >= r) return tree[rt];
	pushdown(myself);
	int mid = half;
	if(ql > mid) return query(Qr);
	else if(qr <= mid) return query(Ql);
	else return max(query(Ql) , query(Qr));
}
signed main(){
	n = read();
	q = read();
	for(int i = 1 ; i <= n ; i ++) scanf("%lld" , &a[i]);
	build(1 , 1 , n);
	//for(int i = 1 ; i <= 11 ; i ++) printf("%d -- %d\n" , i , tree[i]);
	for(int i = 1 , op , l , r , val; i <= q ; i ++){
		op = read();
		l = read();
		r = read();
		if(op == 1) {
			scanf("%lld" , &val);
			update(1 , 1 , n , l , r , 1 , val);
		}
		else if(op == 2){
			scanf("%lld" , &val);
			update(1 , 1 , n , l , r , 2 , val);
		}
		else printf("%lld\n" , query(1 , 1 , n , l , r));
	}
	return 0;
}
2025/1/25 20:29
加载中...