1 条题解

  • -2
    @ 2025-7-8 15:07:50
    #include <bits/stdc++.h>
    using namespace std;
    struct SegTree {
    	std::vector<long long> tree;
    	std::vector<long long> lazy;
    	int n;
    	std::vector<long long> org;
    	void init(vector<long long> &a) {
    		n = a.size();
    		tree.resize(4 * n + 1);
    		lazy.resize(4 * n + 1);
    		org = a;
    		build(1, 1, n - 1);
    	}
    	void build(int node, int l, int r) {
    		if (l == r) {
    			tree[node] = org[l];
    			return;
    		}
    		int mid = (l + r) / 2;
    		build(node * 2, l, mid);
    		build(node * 2 + 1, mid + 1, r);
    		tree[node] = tree[node * 2] + tree[node * 2 + 1];
    	}
    	void maintain(int p, int cl, int cr) {
    		int cm = cl + (cr - cl) / 2;
    		if (cl != cr && lazy[p]) {
    			lazy[p * 2] += lazy[p];
    			lazy[p * 2 + 1] += lazy[p];
    			tree[p * 2] += lazy[p] * (cm - cl + 1);
    			tree[p * 2 + 1] += lazy[p] * (cr - cm);
    			lazy[p] = 0;
    		}
    	}
    	void update(int node, int l, int r, int ql, int qr, long long val) {
    		if (ql > r || qr < l) {
    			return;
    		}
    		if (ql <= l && qr >= r) {
    			tree[node] += val * (r - l + 1);
    			lazy[node] += val;
    			return;
    		}
    		maintain(node, l, r);
    		int mid = (l + r) / 2;
    		update(node * 2, l, mid, ql, qr, val);
    		update(node * 2 + 1, mid + 1, r, ql, qr, val);
    		tree[node] = tree[node * 2] + tree[node * 2 + 1];
    	}
    	long long query(int node, int l, int r, int ql, int qr) {
    		if (ql > r || qr < l) {
    			return 0;
    		}
    		if (ql <= l && qr >= r) {
    			return tree[node];
    		}
    		maintain(node, l, r);
    		int mid = (l + r) / 2;
    		long long ll = query(node * 2, l, mid, ql, qr);
    		long long rr = query(node * 2 + 1, mid + 1, r, ql, qr);
    		return ll + rr;
    	}
    } tree;
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(nullptr);
    	std::cout.tie(nullptr);
    	int n, q;
    	std::cin >> n >> q;
    	std::vector<long long> a(n + 1);
    	for (int i = 1; i <= n; i++) {
    		std::cin >> a[i];
    	}
    	tree.init(a);
    	while (q--) {
    		int op;
    		std::cin >> op;
    		if (op == 1) {
    			int l, r, val;
    			std::cin >> l >> r >> val;
    			tree.update(1, 1, n, l, r, val);
    		} else {
    			int l, r;
    			std::cin >> l >> r;
    			std::cout << tree.query(1, 1, n, l, r) << '\n';
    		}
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    2431
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    31
    已通过
    11
    上传者