Advertisement
Guest User

Task 4

a guest
Jan 9th, 2019
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. class PersistentSegmentTree {
  5. private:
  6.     struct Node {
  7.         int left;
  8.         int right;
  9.         int value;
  10.  
  11.         Node() : left(-1), right(-1), value() {}
  12.     };
  13.  
  14.     int n;
  15.     vector<int> t;
  16.     vector<Node> g;
  17.  
  18.     int clone(int v) {
  19.         int c = g.size();
  20.         g.emplace_back();
  21.         if (v != -1) {
  22.             g[c].left = g[v].left;
  23.             g[c].right = g[v].right;
  24.             g[c].value = g[v].value;
  25.         }
  26.         return c;
  27.     }
  28.  
  29.     int get(int v) {
  30.         if (v == -1)
  31.             return 0;
  32.         return g[v].value;
  33.     }
  34.  
  35.     void update(int v, int l, int r, int p, int x) {
  36.         if (l + 1 == r) {
  37.             g[v].value = x;
  38.             return;
  39.         }
  40.         int m = (l + r) / 2;
  41.         if (p < m) {
  42.             int c = clone(g[v].left);
  43.             g[v].left = c;
  44.             update(c, l, m, p, x);
  45.         } else {
  46.             int c = clone(g[v].right);
  47.             g[v].right = c;
  48.             update(c, m, r, p, x);
  49.         }
  50.         g[v].value = get(g[v].left) + get(g[v].right);
  51.     }
  52.  
  53.     int query(int v, int l, int r, int lq, int rq) {
  54.         if (v == -1 || lq >= rq)
  55.             return 0;
  56.         if (lq == l && rq == r)
  57.             return get(v);
  58.         int m = (l + r) / 2;
  59.         int ls = query(g[v].left, l, m, lq, min(rq, m));
  60.         int rs = query(g[v].right, m, r, max(lq, m), rq);
  61.         return ls + rs;
  62.     }
  63.  
  64. public:
  65.     PersistentSegmentTree(int n) : n(n), t() {
  66.         t.emplace_back();
  67.         g.emplace_back();
  68.         t.reserve(2e6);
  69.         g.reserve(22e6);
  70.     }
  71.  
  72.     int query(int l, int r, int v) {
  73.         return query(t[v], 0, n, l, r);
  74.     }
  75.  
  76.     int update(int p, int x) {
  77.         int v = t.size();
  78.         int c = clone(t.back());
  79.         t.push_back(c);
  80.         update(c, 0, n, p, x);
  81.         return v;
  82.     }
  83. };
  84.  
  85. int main() {
  86.     freopen("input.txt", "rt", stdin);
  87.     freopen("output.txt", "wt", stdout);
  88.     int n, q;
  89.     scanf("%d%d", &n, &q);
  90.     vector<pair<int, int>> a(n);
  91.     int maxa = 0;
  92.     for (int i = 0; i < n; i++) {
  93.         scanf("%d", &a[i].first);
  94.         a[i].second = i;
  95.         maxa = max(maxa, a[i].first);
  96.     }
  97.     sort(a.begin(), a.end());
  98.     vector<int> vers(16e5);
  99.     PersistentSegmentTree tree(n);
  100.     for (const auto& p : a) {
  101.         vers[p.first] = tree.update(p.second, 1);
  102.     }
  103.     for (int i = 1; i < vers.size(); i++) {
  104.         if (vers[i] == 0)
  105.             vers[i] = vers[i - 1];
  106.     }
  107.     for (int i = 0; i < q; i++) {
  108.         int t;
  109.         scanf("%d", &t);
  110.         if (t == 1) {
  111.             int x;
  112.             scanf("%d", &x);
  113.             if (x > 0)
  114.                 vers[x] = vers[x - 1];
  115.         }
  116.         if (t == 2) {
  117.             int l, r, x;
  118.             scanf("%d%d%d", &l, &r, &x);
  119.             printf("%d\n", tree.query(l - 1, r, vers[x]));
  120.         }
  121.     }
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement