cincout

D сборы мск день 1

Jan 9th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<ll, ll> pll;
  7. typedef pair<int, ll> pil;
  8. typedef pair<int, int> pii;
  9. typedef long double ld;
  10.  
  11. #define mp make_pair
  12. #define all(x) (x).begin(), (x).end()
  13.  
  14. const int MAXN = 1e6 + 15;
  15.  
  16. int pref[MAXN], N, Q;
  17. int res[MAXN];
  18. int fen[MAXN];
  19. pair<int, int> a[MAXN];
  20.  
  21. struct Query {
  22. int Rx, l, r, num;
  23. Query() : Rx(0), l(0), r(0), num(0) {}
  24. Query(int b, int c, int d, int r) : Rx(b), l(c), r(d), num(r) {}
  25.  
  26. bool operator < (Query &other) {
  27. return Rx < other.Rx;
  28. }
  29. };
  30.  
  31. Query f[MAXN];
  32.  
  33. void inc(int i, int delta) {
  34. for (; i < MAXN; i = (i | (i + 1)))
  35. fen[i] += delta;
  36. }
  37.  
  38. int sum(int r) {
  39. int res = 0;
  40. for (; r >= 0; r = (r & (r + 1)) - 1) {
  41. res += fen[r];
  42. }
  43. return res;
  44. }
  45.  
  46. int sum(int l, int r) {
  47. return sum(r) - sum(l - 1);
  48. }
  49.  
  50. int main() {
  51. ios_base::sync_with_stdio(false);
  52.  
  53. fill(pref, pref + MAXN, -1);
  54.  
  55. cin >> N >> Q;
  56.  
  57. for (int i = 0; i < N; ++i) {
  58. cin >> a[i].first;
  59. a[i].second = i;
  60. }
  61.  
  62. sort(a, a + N);
  63. set<int> s;
  64.  
  65. for (int i = 0; i < N; ++i) {
  66. pref[a[i].first] = i;
  67. s.insert(a[i].first);
  68. }
  69.  
  70. int z = 0, sz = 0;
  71.  
  72. for (int i = 0; i < Q; ++i) {
  73. int t;
  74. cin >> t;
  75. if (t == 1) {
  76. int x;
  77. cin >> x;
  78. if (s.count(x)) {
  79. s.erase(x);
  80. if (pref[x + 1] == -1) {
  81. pref[x + 1] = pref[x];
  82. s.insert(x + 1);
  83. }
  84. pref[x] = -1;
  85. }
  86. }
  87. else {
  88. int l, r, y;
  89. cin >> l >> r >> y;
  90. --l, --r;
  91. auto it = s.upper_bound(y);
  92. if (it != s.begin()) {
  93. --it;
  94. f[z++] = Query(pref[*it], l, r, sz);
  95. }
  96. sz++;
  97. }
  98. }
  99.  
  100. sort(f, f + z);
  101.  
  102. int ptr = -1;
  103.  
  104. for (int i = 0; i < z; ++i) {
  105. while (ptr < f[i].Rx) {
  106. ptr++;
  107. inc(a[ptr].second, 1);
  108. }
  109. res[f[i].num] = sum(f[i].l, f[i].r);
  110. }
  111.  
  112. for (int i = 0; i < sz; ++i) {
  113. cout << res[i] << "\n";
  114. }
  115.  
  116. return 0;
  117. }
Add Comment
Please, Sign In to add comment