专栏文章

球球球

休闲·娱乐参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minyiolt
此快照首次捕获于
2025/12/02 10:26
3 个月前
此快照最后确认于
2025/12/02 10:26
3 个月前
查看原文
CPP
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
template<typename T> void re(T&x){x = 0; int sign = 1; char c;do{c = getchar(); if (c == '-') sign = -1;}while(!isdigit(c)); do{x = x * 10 + c - '0'; c = getchar();}while(isdigit(c)); x *= sign;}
void write(int x){if (x < 0) x = -x, putchar('-'); if (x < 10) putchar(x + '0'); else write(x / 10), putchar(x % 10 + '0');}

const int N = 2e6 + 100;

struct node{
	ll val, r, l, lzy1 = 0, lzy2 = 0;
};

ll n, m;
ll a[N];
node t[N];

void build(ll id, ll l, ll r){
	t[id].l = l, t[id].r = r;
	if (l == r){
		t[id].val = a[l];
		return;
	}
	ll val1, val2;
	ll mid = l + r >> 1;
	build(id << 1, l, mid);
	build(id << 1 | 1, mid + 1, r);
	val1 = t[id << 1].val, val2 = t[id << 1 | 1].val;
	t[id].val = val1 + val2;
}

void push_down(ll id){
	if (t[id].lzy2 == 1){
		t[id << 1].lzy2 = t[id << 1 | 1].lzy2 = 1;
		t[id << 1].lzy1 = t[id << 1 | 1].lzy1 = 0;
		t[id << 1].val = t[id << 1 | 1].val = 0;
		t[id].lzy2 = 0;
	}
	if (t[id].lzy1 != 0){
		t[id << 1].lzy1 += t[id].lzy1;
		t[id << 1 | 1].lzy1 += t[id].lzy1;
		t[id << 1].val = t[id].lzy1 * (t[id << 1].r - t[id << 1].l + 1);
		t[id << 1 | 1].val = t[id].lzy1 * (t[id << 1 | 1].r - t[id << 1 | 1].l + 1);
		t[id].lzy1 = 0;
	}
}

void add(ll id, ll l, ll r, ll L, ll R, ll pos){
	if (L == l && R == r){
		t[id].val = t[id].val + (r - l + 1) * pos;
		t[id].lzy1 += pos;
		return;
	}
	push_down(id);
	ll mid = l + r >> 1;
	ll val1, val2;
	if (R <= mid) add(id << 1, l, mid, L, R, pos);
	else if (L > mid) add(id << 1 | 1, mid + 1, r, L, R, pos);
	else add(id << 1, l, mid, L, mid, pos), add(id << 1 | 1, mid + 1, r, mid + 1, R, pos);
	val1 = t[id << 1].val, val2 = t[id << 1 | 1].val;
	t[id].val = val1 + val2;
}

void gui0(ll id, ll l, ll r, ll L, ll R){
	if (l == L && r == R){
		t[id].val = 0;
		t[id].lzy1 = 0;
		t[id].lzy2 = 1;
		return;
	}
	push_down(id);
	ll mid = l + r >> 1;
	ll val1, val2;
	if (R <= mid) gui0(id << 1, l, mid, L, R);
	else if (L > mid) gui0(id << 1 | 1, mid + 1, r, L, R);
	else gui0(id << 1, l, mid, L, mid), gui0(id << 1 | 1,mid + 1, r, mid + 1, R);
	val1 = t[id << 1].val, val2 = t[id << 1 | 1].val;
	t[id].val = val1 + val2;
}

ll find(ll id, ll l, ll r, ll L, ll R){
	if (l == L && r == R){
		return t[id].val;
	}
	push_down(id);
	ll mid = l + r >> 1;
	ll val1, val2;
	if (R <= mid) return find(id << 1, l, mid, L, R);
	else if (L > mid) return find(id << 1 | 1, mid + 1, r, L, R);
	else return find(id << 1, l, mid, L, mid) + find(id << 1 | 1, mid + 1, r, mid + 1, R);
	val1 = t[id << 1].val, val2 = t[id << 1 | 1].val;
	t[id].val = val1 + val2;
}

int main(){
//	freopen("2.in", "r", stdin);
//	freopen("2.out", "w",  stdout);
	
	re(n), re(m);
	for (int i = 1; i <= n; i ++){
		re(a[i]);
	}
	build(1, 1, n);
	ll op, l, r, x;
	while (m --){
		re(op), re(l), re(r);
		if (op == 1){
			re(x);
			add(1, 1, n, l, r, x);
		}
		if (op == 2){
			re(x);
			add(1, 1, n, l, r, -x);
		}
		if (op == 3){
			gui0(1, 1, n, l, r);
		}
		if (op == 4){
			printf("%lld\n", find(1, 1, n, l, r));
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...