trafik

DOshit

Apr 3rd, 2022
1,083
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <ext/pb_ds/assoc_container.hpp>
  4. #define ll long long
  5. #define len(v) (int)v.size()
  6. #define all(v) v.begin(), v.end()
  7. const int maxn = 1e5 + 10;
  8. int inf = 1e6;
  9. using namespace std;
  10. using namespace __gnu_pbds;
  11.  
  12. vector<int> nxt(maxn, inf);
  13. int a[maxn];
  14. vector<int> frst(maxn, -1);
  15.  
  16. tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> t[maxn * 4];
  17. void build(int v, int l, int r) {
  18.     if (l + 1 == r) {
  19.         tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> tmp;
  20.         tmp.insert(nxt[l]);
  21.         t[v] = tmp;
  22.         return;
  23.     }
  24.     int m = (l + r) / 2;
  25.     build(2 * v + 1, l, m);
  26.     build(2 * v + 2, m, r);
  27.     //t[v].insert();
  28.     //t[v].insert(all(t[2 * v + 2]));
  29.     //merge(all(t[2 * v + 1]), all(t[2 * v + 2]), t[v].begin());
  30.     for (auto el : t[2 * v + 1])
  31.         t[v].insert(el);
  32.     for (auto el : t[2 * v + 2])
  33.         t[v].insert(el);
  34.  
  35. }
  36.  
  37. void upd(int v, int l, int r, int pos, int x) {
  38.     if (l + 1 == r) {
  39.         tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> tmp;
  40.         tmp.insert(x);
  41.         t[v] = tmp;
  42.     }
  43.     int m = (l + r) / 2;
  44.     if (pos < m)
  45.         upd(2 * v + 1, l, m, pos, x);
  46.     else
  47.         upd(2 * v + 2, m, r, pos, x);
  48.     t[v].clear();
  49.     for (auto el : t[2 * v + 1])
  50.         t[v].insert(el);
  51.     for (auto el : t[2 * v + 2])
  52.         t[v].insert(el);
  53. }
  54.  
  55. ll get(int v, int l, int r, int ql, int qr) {
  56.     if (ql <= l && r <= qr) return (len(t[v]) - t[v].order_of_key(qr));
  57.     if (l >= qr || r <= ql) return 0;
  58.     int m = (l + r) / 2;
  59.     return get(2 * v + 1, l, m, ql, qr) + get(2 * v + 2, m, r, ql, qr);
  60. }
  61.  
  62.  
  63. int n, m;
  64. void solve() {
  65.     cin >> n >> m;
  66.     for (int i = 0; i < n; ++i) {
  67.         cin >> a[i];
  68.         if (frst[a[i]] == -1) {
  69.             frst[a[i]] = i;
  70.         } else if (frst[a[i]] >= 1000000){
  71.             nxt[frst[a[i]]] = i;
  72.             frst[a[i]] = inf++;
  73.         }
  74.     }
  75.     build(0, 0, n);
  76.     while (m--) {
  77.         int tp; cin >> tp;
  78.         if (tp == 1) {
  79.             int l, r; cin >> l >> r;
  80.             --l;
  81.             cout << get(0, 0, n, l, r) << endl;
  82.         } else {
  83.             int i, x; cin >> i >> x;
  84.             --i;
  85.             upd(0, 0, n, i, x);
  86.         }
  87.     }
  88. }
  89.  
  90. int main() {
  91.     ios::sync_with_stdio(0);
  92.     cin.tie(0);
  93.     cout.tie(0);
  94.  
  95.     solve();
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment