xuanquang1999

Jan's LightOJ - 1164 - Horrible Queries (WA)

Nov 20th, 2015
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. //84104971101048411497 - Can you guess what does this mean?
  2. using namespace std;
  3. #include <bits/stdc++.h>
  4. #define mapii map<int, int>
  5. #define debug(a) cout << #a << ": " << a << endl
  6. #define fdto(i, r, l) for(int i = (r); i >= (l); --i)
  7. #define fto(i, l, r) for(int i = (l); i <= (r); ++i)
  8. #define forit(it, type, var) for(type::iterator it = var.begin(); it != var.end(); it++)
  9. #define fordit(rit, type, var) for(type::reverse_iterator rit = var.rbegin(); rit != var.rend(); rit++)
  10. #define ii pair<int, int>
  11. #define iii pair<int, ii>
  12. #define ff first
  13. #define ss second
  14. #define mp make_pair
  15. #define pb push_back
  16. #define ll long long
  17. #define maxN 100005
  18.  
  19. struct NodeType {
  20.     int v;
  21.     ll sum;
  22. };
  23.  
  24. int nTest, n, q;
  25. NodeType IT[4*maxN];
  26.  
  27. void InitTree(int node, int left, int right) {
  28.     IT[node].v = 0; IT[node].sum = 0;
  29.     if (left == right) return;
  30.     int mid = (left+right)/2;
  31.     InitTree(2*node, left, mid);
  32.     InitTree(2*node+1, mid+1, right);
  33. }
  34.  
  35. void Update(int node, int left, int right, int u, int v, int x) {
  36.     if (v < left || right < u) return;
  37.  
  38.     if (u <= left && right <= v) {
  39.         IT[node].v = x;
  40.         IT[node].sum += (ll)x*(ll)(right-left+1);
  41.         return;
  42.     }
  43.  
  44.     int mid = (left+right)/2;
  45.     if (IT[node].v > 0) {
  46.         IT[2*node].v += IT[node].v;
  47.         IT[2*node].sum += (ll)IT[node].v*(ll)(mid-left+1);
  48.         IT[2*node+1].v += IT[node].v;
  49.         IT[2*node+1].sum += (ll)IT[node].v*(ll)(right-mid);
  50.         IT[node].v = 0;
  51.     }
  52.  
  53.     Update(2*node, left, mid, u, v, x);
  54.     Update(2*node+1, mid+1, right, u, v, x);
  55.  
  56.     IT[node].sum = IT[2*node].sum + IT[2*node+1].sum;
  57. }
  58.  
  59. ll Query(int node, int left, int right, int u, int v) {
  60.     if (v < left || right < u) return 0;
  61.  
  62.     if (u <= left && right <= v) return IT[node].sum;
  63.  
  64.     int mid = (left+right)/2;
  65.     if (IT[node].v > 0) {
  66.         IT[2*node].v += IT[node].v;
  67.         IT[2*node].sum += (ll)IT[node].v*(ll)(mid-left+1);
  68.         IT[2*node+1].v += IT[node].v;
  69.         IT[2*node+1].sum += (ll)IT[node].v*(ll)(right-mid);
  70.         IT[node].v = 0;
  71.     }
  72.  
  73.     return Query(2*node, left, mid, u, v) + Query(2*node+1, mid+1, right, u, v);
  74. }
  75.  
  76. int main () {
  77.     #ifndef ONLINE_JUDGE
  78.         freopen("input.txt", "r", stdin);
  79.         freopen("output.txt", "w", stdout);
  80.     #endif // ONLINE_JUDGE
  81.  
  82.     scanf("%d", &nTest);
  83.     fto(iTest, 1, nTest) {
  84.         printf("Case %d:\n", iTest);
  85.         scanf("%d%d", &n, &q);
  86.         InitTree(1, 0, n-1);
  87.         fto(iq, 1, q) {
  88.             int t, u, v;
  89.             scanf("%d%d%d", &t, &u, &v);
  90.             if (t == 0) {
  91.                 int x;
  92.                 scanf("%d", &x);
  93.                 Update(1, 0, n-1, u, v, x);
  94.             }
  95.             else if (t == 1) cout << Query(1, 0, n-1, u, v) << "\n";
  96.         }
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment