Advertisement
Guest User

Untitled

a guest
Aug 10th, 2020
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.45 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <iostream>
  3. using namespace std;
  4. #include <ext/pb_ds/assoc_container.hpp>
  5. #include <ext/pb_ds/tree_policy.hpp>
  6. using namespace __gnu_pbds;
  7. #define speed                   \
  8.   ios_base::sync_with_stdio(0); \
  9.   cin.tie(0);                   \
  10.   cout.tie(0);
  11. #define ll long long
  12. #define pb push_back
  13. #define mem1(a) memset(a, -1, sizeof(a))
  14. #define mem0(a) memset(a, 0, sizeof(a))
  15. #define endl "\n"
  16. #define mod 1000000007
  17. #define mod1 998244353
  18. #define ff first
  19. #define ss second
  20. #define MAX 500005
  21. #define N 300005
  22. #define INF 1000000009
  23. #define all(v) v.begin(), v.end()
  24. #define sbit(a) __builtin_popcount(a)
  25. template <typename T>
  26. using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  27. typedef pair<ll, ll> pll;
  28. typedef pair<pll, ll> ppl;
  29. typedef map<ll, ll> mpll;
  30. typedef map<vector<ll>, ll> mpvl;
  31. ll power(ll x, ll y, ll p)
  32. {
  33.     ll res = 1;
  34.  
  35.     x = x % p;
  36.  
  37.     if (x == 0)
  38.         return 0;
  39.     while (y > 0)
  40.     {
  41.  
  42.         if (y & 1)
  43.             res = (res * x) % p;
  44.  
  45.         y = y >> 1;
  46.         x = (x * x) % p;
  47.     }
  48.  
  49.     return res;
  50. }
  51. struct item {
  52.     ll val, prior;
  53.     ll sum, lazy, sz;
  54.     bool rev;
  55.     item * l, * r;
  56.  
  57. };
  58. typedef item *pitem;
  59. ll cnt(pitem t) {
  60.     return t ? t->sz : 0;
  61. }
  62.  
  63. void upd_cnt(pitem t) {
  64.     if (t)
  65.         t->sz = 1 + cnt(t->l) + cnt(t->r);
  66. }
  67. void lazy(pitem t) {
  68.     if (!t || !t->lazy)return;
  69.     t->val+=t->lazy;//operation of lazy
  70.     t->sum+=t->lazy;
  71.     //*sizeof(t);
  72.     if (t->l)t->l->lazy+=t->lazy;//propagate lazy
  73.     if (t->r)t->r->lazy+=t->lazy;
  74.     t->lazy=0;
  75. }
  76. void reset(pitem t) {
  77.     if (t)t->sum = t->val;//no need to reset lazy coz when we call this lazy would itself be propagated
  78. }
  79. void combine(pitem& t, pitem l, pitem r) {//combining two ranges of segtree
  80.     if (!l || !r)return void(t = l?l:r);
  81.     t->sum = l->sum + r->sum;
  82. }
  83. void operation(pitem t) {//operation of segtree
  84.     if (!t)return;
  85.     reset(t);//reset the value of current node assuming it now represents a single element of the array
  86.     lazy(t->l);lazy(t->r);//imp:propagate lazy before combining t->l,t->r;
  87.     combine(t, t->l, t);
  88.     combine(t, t, t->r);
  89. }
  90. void merge(pitem & t, pitem l, pitem r) {
  91.  
  92.    
  93.     lazy(l);lazy(r);
  94.     if (!l || !r)
  95.         t = l ? l : r;
  96.     else if (l->prior > r->prior)
  97.         merge(l->r, l->r, r), t = l;
  98.     else
  99.         merge(r->l, l, r->l), t = r;
  100.     upd_cnt(t);
  101.     operation(t);
  102. }
  103. void split(pitem t, pitem & l, pitem & r, ll key, ll add=0) {
  104.     if (!t)
  105.         return void(l = r = NULL);
  106.    
  107.     lazy(t);
  108.     ll  cur_pos= add + cnt(t->l);
  109.     if (cur_pos>=key)//element at pos goes to left subtree(l)
  110.         split(t->l, l, t->l, key, add), r=t;
  111.     else
  112.         split(t->r, t->r, r, key, cur_pos+1), l=t;
  113.  
  114.     upd_cnt(t);
  115.     operation(t);
  116. }
  117. ll range_query(pitem t, ll l, ll r) {//[l,r]
  118.     pitem t1, t2, t3;
  119.     split(t, t1, t2, l);
  120.     split(t2, t2, t3, r-l+1);//note: r-l+1!!
  121.     ll ans = t2->sum; //query ans
  122.     merge(t, t1, t2);
  123.     merge(t, t, t3);
  124.     return ans;
  125. }
  126. void range_update(pitem t, ll l, ll r, ll val) {//[l,r]
  127.     pitem t1, t2, t3;
  128.     split(t, t1, t2, l);
  129.     split(t2, t2, t3, r-l+1);//note: r-l+1!!
  130.     t2->lazy+=val; //lazy_update
  131.     merge(t, t1, t2);
  132.     merge(t, t, t3);
  133. }
  134. void reverse(pitem t, ll l, ll r) {
  135.     pitem t1, t2, t3;
  136.     split(t, t1, t2, l);
  137.     split(t2, t2, t3, r-l+1);
  138.     t2->rev ^= true;
  139.     merge(t, t1, t2);
  140.     merge(t, t, t3);
  141. }
  142. pitem init(pitem &ret, ll val) {
  143.  
  144.     ret->prior=rand();ret->sz=1;
  145.     ret->val=val;
  146.     ret->sum=val;ret->lazy=0;
  147.     ret->l=ret->r=NULL;
  148.     return ret;
  149. }
  150.  
  151. void solve()
  152. {
  153.     ll n, q;
  154.     cin>>n>>q;
  155.     pitem root=NULL;
  156.     for (ll i =1;i<=n;i++)
  157.     {
  158.         pitem it=new item;
  159.         init(it, 0);
  160.         if (i==0) root=it;
  161.         else merge(root, root, it);
  162.     }
  163.  
  164.     while (q--)
  165.     {
  166.  
  167.         ll y;
  168.         cin>>y;
  169.  
  170.  
  171.         if (y==0)
  172.         {
  173.  
  174.             ll l, r, add;
  175.             cin>>l>>r>>add;
  176.  
  177.             l--, r--;
  178.             range_update(root, l, r, add);
  179.  
  180.         }
  181.         else
  182.         {
  183.             ll l, r;
  184.             cin>>l>>r;
  185.             l--, r--;
  186.  
  187.             cout<<range_query(root, l, r)<<endl;
  188.         }
  189.  
  190.     }
  191.  
  192.  
  193.  
  194.  
  195. }
  196. int main()
  197. {
  198.  
  199.     speed;
  200.  
  201.     ll kk;
  202.     kk = 1;
  203.     cin >> kk;
  204.     while (kk--)
  205.     {
  206.         srand(time(NULL));
  207.         solve();
  208.     }
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement