【求助】萌新手糊线段树挂掉了,操作 1 RE,有没有神仙帮我看看
查看原帖
【求助】萌新手糊线段树挂掉了,操作 1 RE,有没有神仙帮我看看
642470
BlanketRice楼主2023/12/16 18:50

RT

# include <bits/stdc++.h>

# define int long long

using namespace std;

int n, m, a[200005];

struct Segment {
	
	int w, p;
	
} t[800005] ;

inline void pushup (int u) {
	
	t[u].w = t[u << 1].w + t[u << 1 | 1].w;
	
}

inline void build (int u, int l, int r) {
	
	if (l == r) {
		
		t[u].w = a[l];
		
		return ;
		
	}
	
	int mid = (l + r) >> 1;
	
	build (u << 1, l, mid);
	
	build (u << 1 | 1, mid + 1, r);
	
	pushup (u);
	
}

inline bool InRange (int l, int r, int L, int R) {
	
	return (L <= l && r <= R);
	
}

inline bool OutOfRange (int l, int r, int L, int R) {
	
	return (r < L || l > R);
	
}

inline void maketag (int u, int l, int r, int x) {
	
	t[u].w += (r - l + 1) * x;
	
	t[u].p += x;
	
}

inline void pushdown (int u, int l, int r) {
	
	int mid = (l + r) >> 1;
	
	maketag (u << 1, l, mid, t[u].p);
	
	maketag (u << 1 | 1, mid + 1, r, t[u].p);
	
	t[u].p = 0;
	
}

inline int query (int u, int l, int r, int L, int R) {
	
	if (InRange (l, r, L, R)) return t[u].w;
	
	if (OutOfRange (l, r, L, R)) return 0;
	
	int mid = (l + r) >> 1;
	
	pushdown (u, l, r);
	
	return query (u << 1, l, mid, L, R) + query (u << 1 | 1, mid + 1, r, L, R);
	
}

inline void change (int u, int l, int r, int L, int R, int x) {
	
	if (InRange (l, r, L, R)) maketag (u, l, r, x);
	
	if (OutOfRange (l, r, L, R)) return ;
	
	pushdown (u, l, r);
	
	int mid = (l + r) >> 1;
	
	change (u << 1, l, mid, L, R, x);
	
	change (u << 1 | 1, mid + 1, r, L, R, x);
	
	pushup (u);
	
}

signed main () {
	
	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 op, l, r, x;
		
		cin >> op;
		
		if (op == 1) cin >> l >> r >> x;
		
		if (op == 2 || op == 3) cin >> x;
		
		if (op == 4) cin >> l >> r;
		
		if (op == 1) change (1, 1, n, l, r, x);
		
		if (op == 2) change (1, 1, n, 1, 1, x);
		
		if (op == 3) change (1, 1, n, 1, 1, -x);
		
		if (op == 4) cout << query (1, 1, n, l, r) << endl;
		
		if (op == 5) cout << query (1, 1, n, 1, 1) << endl; 
		
	}
	
	return 0;
	
}

/qdqd

2023/12/16 18:50
加载中...