蒟蒻求助!!!
查看原帖
蒟蒻求助!!!
474282
LGC071030楼主2021/8/22 21:46
#include <cstdio>
#include <cctype>
#define Min(a,b) (a<b?a:b)
#define ll long long
#define LNF 0x9fffffffffffffff

inline int read() {
	int s = 0, w = 1; char ch = getchar();
	while (!isdigit(ch)) {if (ch == '-') w = -1; ch = getchar();}
	while (isdigit(ch)) {s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar();}
	return 1ll * w * s;
}

const int MAXN = 1e5+5;

int n, m;
ll a[MAXN];
struct node_tree {
#define lson (o << 1)
#define rson (o << 1 | 1)
	ll sumv[MAXN << 2], minv[MAXN << 2];
	ll addv[MAXN << 2];
	inline void push_up(int o) {
		sumv[o] = sumv[lson] + sumv[rson];
		minv[o] = Min(minv[lson], minv[rson]);
	}
	inline void push_down(int o, int l, int r) {
		if (!addv[o]) return ;
		int mid = (l + r) >> 1;
		addv[lson] += addv[o]; addv[rson] += addv[o];
		minv[lson] += addv[o]; minv[rson] += addv[o];
		sumv[lson] += (addv[o] * (mid - l + 1));
		sumv[rson] += (addv[o] * (r - mid));
		addv[o] = 0;
	}
	inline void build(int o, int l, int r) {
		addv[o] = 0;
		ll mid = (l + r) >> 1;
		if (l == r) {sumv[o] = a[l]; return ;}
		build(lson, l, mid); build(rson, mid + 1, r);
		push_up(o);
	}
	inline void optadd(int o, int l, int r, int ql, int qr, ll v) {
		if (ql <= l && r <= qr) {
			sumv[o] += v * (r - l + 1);
			minv[o] += v; addv[o] += v;
			return ;
		}
		push_down(o, l, r);
		ll mid = (l + r) >> 1;
		if (ql <= mid) optadd(lson, l, mid, qr, ql, v);
		if (qr > mid) optadd(rson, mid + 1, r, ql, qr, v);
		push_up(o);
	}
	inline ll query_min(int o, int l, int r, int ql, int qr) {
		if (ql <= l && r <= qr) return minv[o];
		ll ans = LNF;
		push_down(o, l, r);
		ll mid = (l + r) >> 1;
		if (ql <= mid) ans = Min(ans, query_min(lson, l, mid, ql, qr));
		if (qr > mid) ans = Min(ans, query_min(rson, mid + 1, r, ql, qr));
		return ans;
	}
	inline ll query_sum(int o, int l, int r, int ql, int qr) {
		if (ql <= l && r <= qr) return sumv[o];
		ll ans = 0;
		push_down(o, l, r);
		ll mid = (l + r) >> 1;
		if (ql <= mid) ans += query_sum(lson, l, mid, ql, qr);
		if (qr > mid) ans += query_sum(rson, mid + 1, r, ql, qr);
		return ans;
	}
}q;

inline void inp() {
	n = read(), m = read();
	for (int i = 1; i <= n; ++ i)
		a[i] = read();
	q.build(1, 1, n);
}

inline void work() {
	while (m --) {
		int pts, x, y, k;
		pts = read();
		x = read(), y = read();
		switch (pts) {
			case 1 :
				k = read();
				q.optadd(1, 1, n, x, y, k); 
				break;
			case 2 :
				printf("%lld\n", q.query_sum(1, 1, n, x, y));
				break;
		}
	}
}

int main() {

	inp();
	work();

	return 0;
}
2021/8/22 21:46
加载中...