Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<bits/stdc++.h>
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <unordered_set>
- #include <unordered_map>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <iterator>
- #include <bitset>
- #include <assert.h>
- #include <new>
- #include <sstream>
- #include <time.h>
- #include <functional>
- #include <numeric>
- #include <utility>
- #include <limits>
- #define endl '\n'
- #define READ() freopen("input", "r", stdin)
- #define WRITE() freopen("output", "w", stdout)
- #define TIME() fprintf(stderr, "\nRuntime: %.10fs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC)
- #define CLOCK() clock_t tStart = clock()
- #define pb push_back
- #define vStr vector<string>
- #define vi vector<int>
- #define vll vector<ll>
- #define vLL vector<ll>
- #define Mii map<int, int>
- #define Msi map<string, int>
- #define Mci map<c, int>
- #define ll long long int
- #define LL long long int
- #define ui unsigned int
- #define ull unsigned long long int
- #define FASTio \
- ios_base::sync_with_stdio(false); \
- cin.tie(NULL);
- using namespace std;
- const ll MX = 1e5 + 5;
- struct segPropagation
- {
- ll prop;
- ll sum;
- };
- vector<segPropagation> segtree(4 * MX);
- void update(ll node, ll start, ll end, ll i, ll j, ll value)
- {
- if (i > end || j < start)
- return;
- if (i <= start && end <= j)
- {
- segtree[node].sum += ((end - start + 1) * value);
- segtree[node].prop += value;
- return;
- }
- ll left = node << 1;
- ll right = left + 1;
- ll mid = (start + end) >> 1;
- update(left, start, mid, i, j, value);
- update(right, mid + 1, end, i, j, value);
- segtree[node].sum = segtree[left].sum + segtree[right].sum + (end - start + 1) * segtree[node].prop;
- }
- ll query(ll node, ll start, ll end, ll i, ll j, ll carry = 0)
- {
- if (i > end || j < start)
- return 0;
- if (i <= start && end <= j)
- return segtree[node].sum + carry * (end - start + 1);
- ll left = node << 1;
- ll right = left + 1;
- ll mid = (start + end) >> 1;
- ll q1 = query(left, start, mid, i, j, carry + segtree[node].prop);
- ll q2 = query(right, mid + 1, end, i, j, carry + segtree[node].prop);
- return q1 + q2;
- }
- int main()
- {
- //---------------------------code_start_from_here-------------------------
- FASTio;
- ll t;
- cin >> t;
- while (t--)
- {
- ll n, q;
- cin >> n >> q;
- for (int i = 1; i <= n; i++)
- {
- segtree[i].sum = 0;
- segtree[i].prop = 0;
- }
- ll a, b, c, d;
- while (q--)
- {
- cin >> a;
- if (a == 0)
- {
- cin >> b >> c >> d;
- update(1, 1, n, b, c, d);
- }
- else
- {
- cin >> b >> c;
- cout << query(1, 1, n, b, c) << endl;
- }
- }
- // segtree.assign(n, {0, 0});
- }
- //---------------------------code_finished--------------------------------
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment