Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //84104971101048411497 - Can you guess what does this mean?
- using namespace std;
- #include <bits/stdc++.h>
- #define mapii map<int, int>
- #define debug(a) cout << #a << ": " << a << endl
- #define fdto(i, r, l) for(int i = (r); i >= (l); --i)
- #define fto(i, l, r) for(int i = (l); i <= (r); ++i)
- #define forit(it, type, var) for(type::iterator it = var.begin(); it != var.end(); it++)
- #define fordit(rit, type, var) for(type::reverse_iterator rit = var.rbegin(); rit != var.rend(); rit++)
- #define ii pair<int, int>
- #define iii pair<int, ii>
- #define ff first
- #define ss second
- #define mp make_pair
- #define pb push_back
- #define ll long long
- #define maxN 100005
- struct NodeType {
- int v;
- ll sum;
- };
- int nTest, n, q;
- NodeType IT[4*maxN];
- void InitTree(int node, int left, int right) {
- IT[node].v = 0; IT[node].sum = 0;
- if (left == right) return;
- int mid = (left+right)/2;
- InitTree(2*node, left, mid);
- InitTree(2*node+1, mid+1, right);
- }
- void Update(int node, int left, int right, int u, int v, int x) {
- if (v < left || right < u) return;
- if (u <= left && right <= v) {
- IT[node].v = x;
- IT[node].sum += (ll)x*(ll)(right-left+1);
- return;
- }
- int mid = (left+right)/2;
- if (IT[node].v > 0) {
- IT[2*node].v += IT[node].v;
- IT[2*node].sum += (ll)IT[node].v*(ll)(mid-left+1);
- IT[2*node+1].v += IT[node].v;
- IT[2*node+1].sum += (ll)IT[node].v*(ll)(right-mid);
- IT[node].v = 0;
- }
- Update(2*node, left, mid, u, v, x);
- Update(2*node+1, mid+1, right, u, v, x);
- IT[node].sum = IT[2*node].sum + IT[2*node+1].sum;
- }
- ll Query(int node, int left, int right, int u, int v) {
- if (v < left || right < u) return 0;
- if (u <= left && right <= v) return IT[node].sum;
- int mid = (left+right)/2;
- if (IT[node].v > 0) {
- IT[2*node].v += IT[node].v;
- IT[2*node].sum += (ll)IT[node].v*(ll)(mid-left+1);
- IT[2*node+1].v += IT[node].v;
- IT[2*node+1].sum += (ll)IT[node].v*(ll)(right-mid);
- IT[node].v = 0;
- }
- return Query(2*node, left, mid, u, v) + Query(2*node+1, mid+1, right, u, v);
- }
- int main () {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif // ONLINE_JUDGE
- scanf("%d", &nTest);
- fto(iTest, 1, nTest) {
- printf("Case %d:\n", iTest);
- scanf("%d%d", &n, &q);
- InitTree(1, 0, n-1);
- fto(iq, 1, q) {
- int t, u, v;
- scanf("%d%d%d", &t, &u, &v);
- if (t == 0) {
- int x;
- scanf("%d", &x);
- Update(1, 0, n-1, u, v, x);
- }
- else if (t == 1) cout << Query(1, 0, n-1, u, v) << "\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment