10pts 求条
查看原帖
10pts 求条
593445
Serendipitous楼主2024/12/8 16:11
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ls (a[k].son[0])
#define rs (a[k].son[1])
const int N = 1000005;
struct{
	int son[2];
	LL sum;
	LL add_tag, cha_tag;
	bool used = 0;
}a[4*N];
int n, m;
int val[N], cnt, root;

void update(int k){
	a[k].sum = max(a[ls].sum, a[rs].sum);
}

void cha(int k, int cha_val){
	a[k].cha_tag = cha_val;
	a[k].add_tag = 0;
	a[k].sum = cha_val;
	a[k].used = 1;
}

void add(int k, int add_val){
	a[k].add_tag += add_val;
	a[k].sum += add_val;
}

void push_down(int k){
	if(a[k].add_tag){
		add(ls, a[k].add_tag);
		add(rs, a[k].add_tag);
	}
	if(a[k].used){
		cha(ls, a[k].cha_tag);
		a[ls].sum += a[ls].add_tag;
		cha(rs, a[k].cha_tag);
		a[rs].sum += a[rs].add_tag;
		a[ls].add_tag = a[k].add_tag;
		a[rs].add_tag = a[k].add_tag;
	}
	a[k].used = a[k].add_tag = a[k].cha_tag = 0;
}

void build(int &k, int l, int r){
	k = ++cnt;
	a[k].sum = -1e8;
	if(l == r){
		a[k].sum = val[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(ls, l, mid);
	build(rs, mid+1, r);
	update(k);
}

void modify1(int k, int l, int r, int ql, int qr, int cha_val){
	if(ql <= l && qr >= r){
		cha(k, cha_val);
		return;
	}
	push_down(k);
	int mid = (l + r) >> 1;
	if(qr <= mid) modify1(ls, l, mid, ql, qr, cha_val);
	if(ql > mid) modify1(rs, mid+1, r, ql, qr, cha_val);
	update(k);
}

void modify2(int k, int l, int r, int ql, int qr, int add_val){
	if(ql <= l && qr >= r){
		add(k, add_val);
		return;
	}
	push_down(k);
	int mid = (l + r) >> 1;
	if(qr <= mid) modify2(ls, l, mid, ql, qr, add_val);
	if(ql > mid) modify2(rs, mid+1, r, ql, qr, add_val);
	update(k);
}

LL query(int k, int l, int r, int ql, int qr){
	if(ql <= l && qr >= r)
		return a[k].sum;
	push_down(k);
	int mid = (l + r) >> 1;
	if(qr <= mid) return query(ls, l, mid, ql, qr);
	if(ql > mid) return query(rs, mid+1, r, ql, qr);
	return max(query(ls, l, mid, ql, qr), query(rs, mid+1, r, ql, qr));
}

int main(){
	cin >> n >> m;
	for(int i=1;i<=n;i++)
		scanf("%d", &val[i]);
	build(root, 1, n);
	for(int i=1;i<=m;i++){
		int op, x, y, v;
		cin >> op;
		if(op == 1){
			scanf("%d%d%d", &x, &y, &v);
			modify1(root, 1, n, x, y, v);
		}
		else if(op == 2){
			scanf("%d%d%d", &x, &y, &v);
			modify2(root, 1, n, x, y, v);
		} 
		else {
			scanf("%d%d", &x, &y);
			printf("%lld\n", query(root, 1, n, x, y));
		}
	}
	return 0;
}
2024/12/8 16:11
加载中...