DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
2.5 KiB

  1. /*
  2. #pragma GCC target ("avx2")
  3. #pragma GCC optimize ("Ofast")
  4. #pragma GCC optimize ("unroll-loops")
  5. */
  6. #include "bits/stdc++.h"
  7. #define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
  8. #define BIT(x) __builtin_popcount(x)
  9. #define all(x) x.begin() , x.end()
  10. #define F first
  11. #define S second
  12. #define pb push_back
  13. using namespace std ;
  14. typedef unsigned long long UL ;
  15. typedef long long L ;
  16. typedef string T ;
  17. typedef int I ;
  18. const I MaxN = 1e5+1 ;
  19. const I MOD = 1e9+7 ;
  20. const I inf = 2e9+7 ;
  21. const L INF = 2e18+7 ;
  22. L a[MaxN], n, m ;
  23. struct{
  24. L mn = INF, c = 0 ;
  25. } t[MaxN*4] ;
  26. void build(int v, int tl, int tr)
  27. {
  28. if(tl == tr)
  29. {
  30. t[v].mn = a[tl] ;
  31. t[v].c = 1 ;
  32. return ;
  33. }
  34. int tm = (tl + tr) >> 1 ;
  35. build(v*2, tl, tm) ;
  36. build(v*2+1, tm+1, tr) ;
  37. t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ;
  38. t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ;
  39. }
  40. void update(int v, int tl, int tr, int l, int x)
  41. {
  42. if(tl == tr && tl == l)
  43. {
  44. t[v].mn = x ;
  45. t[v].c = 1 ;
  46. return ;
  47. }
  48. if(tr < l || l < tl)
  49. return ;
  50. int tm = (tl + tr) >> 1 ;
  51. update(v*2, tl, tm, l, x) ;
  52. update(v*2+1, tm+1, tr, l, x) ;
  53. t[v].mn = min(t[v*2].mn, t[v*2+1].mn) ;
  54. t[v].c = (t[v].mn==t[v*2].mn?t[v*2].c:0) + (t[v].mn==t[v*2+1].mn?t[v*2+1].c:0) ;
  55. }
  56. L get(int v, int tl, int tr, int l, int r)
  57. {
  58. if(l <= tl && tr <= r)
  59. return t[v].mn ;
  60. if(l > tr || r < tl)
  61. return INF ;
  62. int tm = (tl + tr) >> 1 ;
  63. return min(get(v*2, tl, tm, l, r), get(v*2+1, tm+1, tr, l, r)) ;
  64. }
  65. L col(int v, int tl, int tr, int l, int r, int mn)
  66. {
  67. if(l <= tl && tr <= r)
  68. return (t[v].mn == mn?t[v].c:0) ;
  69. if(l > tr || r < tl)
  70. return 0 ;
  71. int tm = (tl + tr) >> 1 ;
  72. L cl = 0 ;
  73. cl += col(v*2, tl, tm, l, r, mn) ;
  74. cl += col(v*2+1, tm+1, tr, l, r, mn) ;
  75. return cl ;
  76. }
  77. int32_t main(int argc, char *argv[])
  78. {
  79. if(argc > 1)
  80. freopen(argv[1], "r", stdin) ;
  81. //freopen(".in" , "r" , stdin) ;
  82. //freopen(".out" , "w" , stdout) ;
  83. cin >> n >> m ;
  84. for(int i = 0 ; i < n ; ++i)
  85. cin >> a[i] ;
  86. build(1, 0, n-1) ;
  87. while(m--)
  88. {
  89. int type, l, r, x ;
  90. cin >> type ;
  91. if(type == 1)
  92. {
  93. cin >> l >> x ;
  94. update(1, 0, n-1, l, x) ;
  95. }
  96. else
  97. {
  98. cin >> l >> r ;
  99. int mn = get(1, 0, n-1, l, r-1), cl = col(1, 0, n-1, l, r-1, mn) ;
  100. cout << mn << ' ' << cl << '\n' ;
  101. }
  102. }
  103. }