Advertisement
boook

Untitled

Jan 29th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. using namespace std;
  4. using namespace __gnu_pbds;
  5. #define REP(i,j,k) for(int i = j ; i < k ; ++i)
  6. #define RREP(i,j,k) for(int i = j ; i >=k ; --i)
  7. #define A first
  8. #define B second
  9. #define mp make_pair
  10. #define pb emplace_back
  11. #define PII pair<int , int>
  12. #define MEM(i,j) memset(i , j , sizeof i)
  13. #define ALL(i) i.begin() , i.end()
  14. #define DBGG(i,j) cout << i << " " << j << endl
  15. #define DB4(i,j,k,l) cout << i << " " << j << " " << k << " " << l << endl
  16. #define IOS cin.tie() , cout.sync_with_stdio(0)
  17. #define endl "\n"
  18. ///------------------------------------------------------------
  19. #define int long long
  20. #define MAX 300900
  21. #define INF 10000000000090LL
  22. #define ls (now << 1)
  23. #define rs (now << 1 | 1)
  24. #define mid ((l + r) >> 1)
  25.  
  26. int n , m;
  27. int x[MAX] , sml[MAX * 4] , sec[MAX * 4] , sum[MAX * 4] , cnt[MAX * 4];
  28. void Pull(int now , int l , int r){
  29. sum[now] = sum[ls] + sum[rs];
  30.  
  31. sml[now] = min(sml[ls] , sml[rs]);
  32.  
  33. cnt[now] = 0;
  34. if(sml[now] == sml[ls]) cnt[now] += cnt[ls];
  35. if(sml[now] == sml[rs]) cnt[now] += cnt[rs];
  36.  
  37. sec[now] = min(sec[ls] , sec[rs]);
  38. if(sml[now] != sml[ls]) sec[now] = min(sec[now] , sml[ls]);
  39. if(sml[now] != sml[rs]) sec[now] = min(sec[now] , sml[rs]);
  40.  
  41. }
  42. void Push(int now , int l , int r){
  43. if(l == r) return;
  44. if(sml[ls] < sml[now]){
  45. if(sml[now] < sec[ls]){
  46. sum[ls] += (sml[now] - sml[ls]) * cnt[ls];
  47. sml[ls] = sml[now];
  48. }
  49. else Push(ls , l , mid);
  50. }
  51. if(sml[rs] < sml[now]){
  52. if(sml[now] < sec[rs]){
  53. sum[rs] += (sml[now] - sml[rs]) * cnt[rs];
  54. sml[rs] = sml[now];
  55. }
  56. else Push(rs , mid + 1 , r);
  57. }
  58. }
  59. void update(int now , int l , int r , int ql , int qr , int val){
  60. if(val <= sml[now]) return;
  61. Push(now , l , r);
  62. if(ql <= l && r <= qr){
  63. if(l == r) cnt[now] = 1 , sec[now] = INF;
  64. if(val < sec[now]){
  65. sum[now] += (val - sml[now]) * cnt[now];
  66. sml[now] = val;
  67. }
  68. else{
  69. update(ls , l , mid , ql , qr , val);
  70. update(rs , mid + 1 , r , ql , qr , val);
  71. Pull(now , l , r);
  72. }
  73. return;
  74. }
  75. if(ql <= mid) update(ls , l , mid , ql , qr , val);
  76. if(mid + 1 <= qr) update(rs , mid + 1 , r , ql , qr , val);
  77. Pull(now , l , r);
  78. }
  79. int query(int now , int l , int r , int ql , int qr){
  80. Push(now , l , r);
  81. if(ql <= l && r <= qr) return sum[now];
  82. if(qr <= mid) return query(ls , l , mid , ql , qr);
  83. if(mid + 1 <= ql) return query(rs , mid + 1 , r , ql , qr);
  84. return query(ls , l , mid , ql , qr) + query(rs , mid + 1 , r , ql , qr);
  85. }
  86. int32_t main(){
  87. IOS;
  88. cin >> n >> m;
  89. REP(i , 1 , n + 1) cin >> x[i];
  90. REP(i , 1 , n + 1) update(1 , 1 , n , i , i , x[i]);
  91.  
  92. REP(i , 1 , m + 1){
  93. int ty , l , r , v;
  94. cin >> ty;
  95. if(ty == 1){
  96. cin >> l >> r >> v;
  97. update(1 , 1 , n , l , r , v);
  98. }
  99. else{
  100. cin >> l >> r;
  101. cout << query(1 , 1 , n , l , r) << endl;
  102. }
  103. }
  104.  
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement