Hydracody

Untitled

Nov 14th, 2023 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #include<ext/pb_ds/assoc_container.hpp>
  4. #include<ext/pb_ds/tree_policy.hpp>
  5. using namespace __gnu_pbds;
  6. #define LagaKar ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  7. #define pb push_back
  8. #define pf push_front
  9. #define pob pop_back
  10. #define pof pop_front
  11. #define mp make_pair
  12. #define fi first
  13. #define se second
  14. #define lb lower_bound
  15. #define ub upper_bound
  16. #define ook order_of_key   //number of elements less than k
  17. #define fbo find_by_order  //k th element
  18. #define nline "\n"
  19. #define YES cout<<"YES"<<nline
  20. #define NO cout<<"NO"<<nline
  21. #define Yes cout<<"Yes"<<nline
  22. #define No cout<<"No"<<nline
  23. //--------------------------------------------------------------------------------------------------------------
  24. #define precise(ans)  cout<<fixed<<setprecision(15)<<ans
  25. #define fo(i,n) for(ll i=0;i<n;i++)
  26. #define Fo(i,k,n) for(ll i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
  27. #define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
  28. #define sz(x) ((ll)(x).size())
  29. #define all(x) x.begin(), x.end()
  30. #define MAX(x) *max_element(all(x))
  31. #define MIN(x) *min_element(all(x))
  32. #define SUM(x) accumulate(all(x), 0LL)
  33. #define CNT(x) __builtin_popcountll(x)
  34. //--------------------------------------------------------------------------------------------------------------
  35. typedef long long ll; typedef unsigned long long ull; typedef long double lld;
  36. template <typename T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  37. template <typename T, typename R> using o_map = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  38. typedef pair<ll, ll>  pl;   typedef vector<ll>  vl;typedef vector<vl>  vvl;
  39. typedef vector<pl>  vpl;    template <typename T> using prq_mx  = priority_queue<T>;
  40. template <typename T> using prq_mn = priority_queue<T, vector<T>, greater<T>>;
  41. //------------------------------------------------------------------------------------------------------------
  42. #ifdef hydracody
  43.     #include <C:\Users\Anurag Dwivedi\Desktop\cpc\debug.h>
  44. #else
  45. #define debug(x)
  46. #endif
  47. //------------------------------------------------------------------------------------------------------------
  48. const double eps=1e-9;const ll INF=(ll)1e9;const ll inf64=2e18;const ll INF64=9e18;
  49. #define PI 3.1415926535897932384626
  50. #define MOD 1000000007
  51. #define MOD1 998244353
  52. #define MOD2 1000000009
  53. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  54. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  55. ll gcd(ll a, ll b) {if (b > a) {return gcd(b, a);} if (b == 0) {return a;} return gcd(b, a % b);}
  56. ll power(ll x,ll y, ll p){if(y==0)return 1;ll res = 1;x = x % p;if (x == 0) return 0;while (y > 0){if (y & 1)res = (res*x) % p;y = y>>1;x = (x*x) % p;}return res;}
  57. ll pinv(ll a, ll m){ return power(a, m - 2, m); }
  58. ll int_sqrt (ll x) {ll ans = 0; for (ll k = 1LL << 30; k != 0; k /= 2) {if ((ans + k) * (ans + k) <= x) {ans += k;}} return ans;}
  59. ll logceil(ll x){ll s=0;while(x>0){s++;x=x/2;}return s;}
  60. ll mod_add(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a + b) % m) + m) % m;}
  61. ll mod_mul(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a * b) % m) + m) % m;}
  62. ll mod_sub(ll a, ll b, ll m) {a = a % m; b = b % m; return (((a - b) % m) + m) % m;}
  63. ll mod_div(ll a, ll b, ll m) {a = a % m; b = b % m; return (mod_mul(a, pinv(b, m), m) + m) % m;}  //only for prime m
  64. ll phin(ll n) {ll number = n; if (n % 2 == 0) {number /= 2; while (n % 2 == 0) n /= 2;} for (ll i = 3; i <= sqrt(n); i += 2) {if (n % i == 0) {while (n % i == 0)n /= i; number = (number / i * (i - 1));}} if (n > 1)number = (number / n * (n - 1)) ; return number;} //O(sqrt(N))
  65. ll getRandomNumber(ll l, ll r) {return uniform_int_distribution<ll>(l, r)(rng);}
  66. void starter(int t) {cout << "Case #" << t << ": ";}
  67.  
  68. /////////////////////////////////////////////////////////////////////////////////////////////////
  69. /*Don't loss hope, one day you will make it. Till then work hard.*/
  70.  
  71. struct update
  72. {
  73.   ll a,d;
  74.   update(){
  75.     a=0;
  76.     d=0;
  77.   }
  78.   update(ll a,ll d){
  79.     this->a=a;
  80.     this->d=d;
  81.   }
  82.   bool operator==(const update& other) const{
  83.     return  a==other.a && d==other.d;
  84.   }
  85. };
  86.  
  87. #define ll long long
  88. template<class T, class U>
  89. // T -> node, U->update.
  90. struct Lsegtree{
  91.     vector<T>st;
  92.     vector<U>lazy;
  93.     ll n;
  94.     T identity_element;
  95.     U identity_update;
  96.     Lsegtree(ll n, T identity_element, U identity_update)
  97.     {
  98.         this->n = n;
  99.         this->identity_element = identity_element;
  100.         this->identity_update = identity_update;
  101.         st.assign(4*n,identity_element);
  102.         lazy.assign(4*n, identity_update);
  103.     }
  104.     T combine(T l, T r)
  105.     {
  106.         // change this function as required.
  107.         T ans = (l + r);
  108.         return ans;
  109.     }
  110.     void buildUtil(ll v, ll tl, ll tr, vector<T>&a)
  111.     {
  112.         if(tl == tr)
  113.         {
  114.             st[v] = a[tl];
  115.             return;
  116.         }
  117.         ll tm = (tl + tr)>>1;
  118.         buildUtil(2*v + 1, tl, tm,a);
  119.         buildUtil(2*v + 2,tm+1,tr,a);
  120.         st[v] = combine(st[2*v + 1], st[2*v + 2]);
  121.     }
  122.     // change the following 2 functions, and you're more or less done.
  123.     T apply(T curr, U upd, ll tl, ll tr)
  124.     {
  125.         T ans = curr;
  126.         ll n1=tr-tl+1;
  127.         ll x=n1*(2*upd.a + (n1-1)*upd.d);
  128.         x/=2;
  129.         ans+=x;
  130.         return ans;
  131.     }
  132.     U combineUpdate(U old_upd, U new_upd, ll tl, ll tr)
  133.     {
  134.         U ans = old_upd;
  135.         ans.a+=new_upd.a;
  136.         ans.d+=new_upd.d;
  137.         return ans;
  138.     }  
  139.     void push_down(ll v, ll tl, ll tr)
  140.     {
  141.         if(lazy[v] == identity_update)return;
  142.         st[v] = apply(st[v], lazy[v], tl, tr);
  143.         if(2*v + 2 < 4*n)
  144.         {
  145.             ll tm = (tl + tr)>>1;
  146.  
  147.             lazy[2*v + 1] = combineUpdate(lazy[2*v+1], lazy[v], tl, tm);
  148.             U x=lazy[v];
  149.             ll n1=tm+1-tl+1;
  150.             x.a=x.a+(n1-1)*x.d;
  151.             lazy[2*v + 2] = combineUpdate(lazy[2*v+2], x, tm+1,tr);            
  152.         }
  153.         lazy[v] = identity_update;
  154.     }
  155.     T queryUtil(ll v, ll tl, ll tr, ll l, ll r)
  156.     {
  157.         push_down(v,tl,tr);
  158.         if(l > r)return identity_element;
  159.         if(tr < l or tl > r)
  160.         {
  161.             return identity_element;
  162.         }
  163.         if(l <= tl and r >= tr)
  164.         {
  165.             return st[v];
  166.         }
  167.         ll tm = (tl + tr)>>1;
  168.         return combine(queryUtil(2*v+1,tl,tm,l,r), queryUtil(2*v+2,tm+1,tr,l,r));
  169.     }
  170.  
  171.     void updateUtil(ll v, ll tl, ll tr, ll l, ll r, U upd)
  172.     {
  173.         push_down(v,tl,tr);
  174.         if(tr < l or tl > r)return;
  175.         if(tl >=l and tr <=r)
  176.         {
  177.             lazy[v] = combineUpdate(lazy[v],upd,tl,tr);
  178.             push_down(v,tl,tr);
  179.         }
  180.         else
  181.         {
  182.             ll tm = (tl + tr)>>1;
  183.             updateUtil(2*v+1,tl,tm,l,r,upd);
  184.             updateUtil(2*v+2,tm+1,tr,l,r,upd);
  185.             st[v] = combine(st[2*v + 1], st[2*v+2]);
  186.         }
  187.     }
  188.  
  189.  
  190.  
  191.     void build(vector<T>a)
  192.     {
  193.         assert(sz(a) == n);
  194.         buildUtil(0,0,n-1,a);
  195.     }
  196.     T query(ll l, ll r)
  197.     {
  198.         return queryUtil(0,0,n-1,l,r);
  199.     }
  200.     void update(ll l,ll r, U upd)
  201.     {
  202.         updateUtil(0,0,n-1,l,r,upd);
  203.     }
  204. };
  205.  
  206.  
  207.  
  208.  
  209.  
  210. void  chal(){
  211.   ll n,m;
  212.   cin>>n>>m;
  213.   vl aa(n);
  214.   fo(i,n){
  215.     cin>>aa[i];
  216.   }
  217.   update upd(0,0);
  218.   Lsegtree<ll,update> st(n,0,upd);
  219.   st.build(aa);
  220.   fo(i,m){
  221.     ll ty;
  222.     cin>>ty;
  223.     if(ty==1){
  224.       ll l,r;
  225.       cin>>l>>r;
  226.       l--;r--;
  227.       update upd1(1,1);
  228.       st.update(l,r,upd1);
  229.     }else{
  230.       ll l,r;
  231.       cin>>l>>r;
  232.       l--;r--;
  233.       cout<<st.query(l,r)<<nline;
  234.     }
  235.   }
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256. }
  257.  
  258.  
  259.  
  260.  
  261. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  262. int32_t main() {
  263.   LagaKar;
  264. #ifdef hydracody
  265.   freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("error.txt", "w", stderr);
  266. #endif
  267.   ll  t; t = 1;
  268.   // cin>>t;
  269.   for (ll i = 1; i <= t; i++) {
  270.     // cerr<<"Case : "<<i<<endl;
  271.     // starter();
  272.     chal();
  273.   }
  274.   return 0;
  275. }
Advertisement
Add Comment
Please, Sign In to add comment