Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- typedef long long ll;
- using namespace std;
- struct segTree {
- int size = 1;
- vector<ll> sums, ops;
- void init(int n) {
- while(size < n) {
- size *= 2;
- }
- ops.assign(2*size, 0);
- sums.assign(2*size, 0);
- }
- void modify(int l, int r, ll v, int x, int lx, int rx) {
- if(lx >= r || l >= rx) {
- return;
- }
- if(l <= lx && rx <= r) {
- ops[x] += v;
- sums[x] += v*(ll)(rx-lx);
- return;
- }
- int m = (lx+rx)/2;
- modify(l, r, v, 2*x+1, lx, m);
- modify(l, r, v, 2*x+2, m, rx);
- sums[x] = sums[2*x+1]+sums[2*x+2]+ops[x]*(ll)(rx-lx);
- }
- void modify(int l, int r, ll v) {
- modify(l, r, v, 0, 0, size);
- }
- ll getSum(int l, int r, int x, int lx, int rx) {
- if(l >= rx || lx >= r) {
- return 0;
- }
- if(l <= lx && rx <= r) {
- return sums[x];
- }
- int m = (lx+rx)/2;
- return getSum(l, r, 2*x+1, lx, m)+getSum(l, r, 2*x+2, m, rx)+ops[x]*(ll)(min(rx, r)-max(lx, l));
- }
- ll getSum(int l, int r) {
- return getSum(l, r, 0, 0, size);
- }
- };
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- int n, m; cin >> n >> m;
- segTree st; st.init(n);
- while(m--) {
- int op; cin >> op;
- if(op == 1) {
- int l, r; ll v;
- cin >> l >> r >> v;
- st.modify(l, r, v);
- } else {
- int l, r; cin >> l >> r;
- cout << st.getSum(l, r) << "\n";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement