Advertisement
K_Y_M_bl_C

Untitled

Oct 9th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define FAST_ALLOCATOR_MEMORY 533000000
  4.  
  5. #ifdef FAST_ALLOCATOR_MEMORY
  6.     int allocator_pos = 0;
  7.     char allocator_memory[(int)FAST_ALLOCATOR_MEMORY];
  8.     inline void * operator new ( size_t n ) {
  9.         char *res = allocator_memory + allocator_pos;
  10.         allocator_pos += n;
  11.         assert(allocator_pos <= (int)FAST_ALLOCATOR_MEMORY);
  12.         return (void *)res;
  13.     }
  14.     inline void operator delete ( void * ) noexcept { }
  15. #endif
  16.  
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20. typedef pair<int, int> pii;
  21. typedef vector<int> vi;
  22.  
  23. #define X first
  24. #define Y second
  25. #define inb push_back
  26. #define mk make_pair
  27. #define all(v) v.begin(), v.end()
  28. #define sqr(x) (x) * (x)
  29.  
  30. int solve();
  31.  
  32. int main()
  33. {
  34.     solve();
  35.     return 0;
  36. }
  37.  
  38. struct PersistentSegmentTree
  39. {
  40.     struct Node
  41.     {
  42.         ll val, add;
  43.         Node *l, *r;
  44.         Node() { l = nullptr, r = nullptr; };
  45.         Node(Node *t) : val(t->val), add(t->add), l(t->l), r(t->r) {};
  46.         Node(ll val, Node *l, Node *r) : val(val), add(0), l(l), r(r) {};
  47.         Node(ll val, ll add, Node *l, Node *r) : val(val), add(add), l(l), r(r) {};
  48.     };
  49.     vector<Node*> rts;
  50.     PersistentSegmentTree() { rts.inb(new Node()); };
  51.     PersistentSegmentTree(vector<ll> &a)
  52.     {
  53.         Node *rr = new Node();
  54.         rr = build(rr, 0, a.size() - 1, a);
  55.         rts.inb(rr);
  56.     };
  57.     ll getval(Node *t)
  58.     {
  59.         if (!t)
  60.             return 0;
  61.         return t->val;
  62.     }
  63.     ll getadd(Node *t)
  64.     {
  65.         if (!t)
  66.             return 0;
  67.         return t->add;
  68.     }
  69.     Node * build(Node *t, int tl, int tr, vector<ll> &a)
  70.     {
  71.         if (tl == tr)
  72.             return new Node(a[tl], 0, 0);
  73.         int tm = tl + tr >> 1;
  74.         t->l = new Node();
  75.         t->r = new Node();
  76.         Node *l = build(t->l, tl, tm, a);
  77.         Node *r = build(t->r, tm + 1, tr, a);
  78.         return new Node(getval(l) + getval(r), l, r);
  79.     }
  80.     void push(Node *t, int tl, int tr)
  81.     {
  82.         if (!t || !t->add)
  83.             return;
  84.         int sz = tr - tl + 1;
  85.         t->val += t->add * sz;
  86.         if (tl != tr)
  87.         {
  88.             t->l = new Node(t->l);
  89.             t->r = new Node(t->r);
  90.             t->l->add += t->add;
  91.             t->r->add += t->add;
  92.         }
  93.         t->add = 0;
  94.     }
  95.     Node * update(Node *t, int tl, int tr, int l, int r, ll val)
  96.     {
  97.         push(t, tl, tr);
  98.         if (tl > r || tr < l)
  99.             return 0;
  100.         if (l <= tl && tr <= r)
  101.         {
  102.             Node *res = new Node(t);
  103.             res->add += val;
  104.             push(res, tl, tr);
  105.             return res;
  106.         }
  107.         int tm = tl + tr >> 1;
  108.         Node *L = update(t->l, tl, tm, l, r, val);
  109.         Node *R = update(t->r, tm + 1, tr, l, r, val);
  110.         if (!L)
  111.             L = t->l;
  112.         if (!R)
  113.             R = t->r;
  114.         return new Node(getval(L) + getval(R), L, R);
  115.     }
  116.     ll get(Node *t, int tl, int tr, int l, int r)
  117.     {
  118.         if (tl > r || tr < l)
  119.             return 0;
  120.         if (l <= tl && tr <= r)
  121.             return t->val + t->add * (tr - tl + 1);
  122.         push(t, tl, tr);
  123.         int tm = tl + tr >> 1;
  124.         return get(t->l, tl, tm, l, r) + get(t->r, tm + 1, tr, l, r);
  125.     }
  126.     void print(Node *t, int tl, int tr)
  127.     {
  128.         push(t, tl, tr);
  129.         if (tl == tr)
  130.         {
  131.             printf("%lld ", t->val);
  132.             return;
  133.         }
  134.         int tm = tl + tr >> 1;
  135.         print(t->l, tl, tm);
  136.         print(t->r, tm + 1, tr);
  137.     }
  138. };
  139.  
  140. int solve()
  141. {
  142.     int n, m;
  143.     scanf("%d %d", &n, &m);
  144.     ll S = 0;
  145.     vector<ll> a(m);
  146.     for (int i = 0; i < m; ++i)
  147.     {
  148.         scanf("%lld", &a[i]);
  149.     }
  150.     PersistentSegmentTree T(a);
  151.     for (int i = 0; i < n - 1; ++i)
  152.     {
  153.         int p, x, y, v, z, t;
  154.         scanf("%d %d %d %d %d %d", &p, &x, &y, &v, &z, &t);
  155.         --p;
  156.         int l = (x + S) % m;
  157.         int r = (y + S) % m;
  158.         int L = (z + S) % m;
  159.         int R = (t + S) % m;
  160.         T.rts.inb(T.update(T.rts[p], 0, m - 1, l, r, v));
  161.         S = T.get(T.rts.back(), 0, m - 1, L, R);
  162.         //printf("TREE %d:\n", i + 1);
  163.         //T.print(T.rts.back(), 0, m - 1);
  164.         //puts("");
  165.         printf("%lld\n", S);
  166.     }
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement