Advertisement
MathQ_

Untitled

Jun 20th, 2021
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. const int MAXN = 4e5;
  2. int a[MAXN];
  3. //int nocol[MAXN];
  4. int usd[MAXN];
  5. class SegTree {
  6. private:
  7.     int n;
  8.     vector<int> tree;
  9.     void push(int v, int l, int r) {
  10.         if (l == r + 1) return;
  11.         if (tree[v] == -1) return;
  12.         tree[2 * v + 1] = tree[v];
  13.         tree[2 * v + 2] = tree[v];
  14.     }
  15.     void upd(int v, int l, int r, int L, int R, int val) {
  16.         push(v, l, r);
  17.         if (L <= l && r <= R) {
  18.             tree[v] = val;
  19.             return;
  20.         }
  21.         if (R <= l || r <= L) {
  22.             return;
  23.         }
  24.         int m = (r + l) / 2;
  25.         upd(2 * v + 1, l, m, L, R, val);
  26.         upd(2 * v + 2, m, r, L, R, val);
  27.     }
  28.  
  29. public:
  30.     int get(int i) {
  31.         int v = 0, l = 0, r = n;
  32.         int ans = -1;
  33.         while (true) {
  34.             push(v, l, r);
  35.             ans = tree[v];
  36.             if (l == r - 1) break;
  37.             int m = (r + l) / 2;
  38.             if (i < m) {
  39.                 v = 2 * v + 1;
  40.                 r = m;
  41.             } else {
  42.                 v = 2 * v + 2;
  43.                 l = m;
  44.             }
  45.         }
  46.         return ans;
  47.     }
  48.     void upd(int l, int r, int x) {
  49.         upd(0, 0, n, l, r, x);
  50.     }
  51.     SegTree (int n) {
  52.         this->n = n;
  53.         tree.assign(4 * n, -1);
  54.        
  55.     }
  56. };
  57. set<int> pos[MAXN];
  58. void solve() {
  59.     //code here
  60.     int n;
  61.     cin >> n;
  62.     for (int i = 1; i <= n; ++i) {
  63.         cin >> a[i];
  64.         pos[a[i]].insert(i);
  65.     }
  66.     int m;
  67.     cin >> m;
  68.     SegTree nocol(5 * n + 100);
  69.     vector<vector<int>> ans;
  70.  
  71.     for (int q = 0; q < m; ++q) {
  72.         int x;
  73.         cin >> x;
  74.         if (usd[x]) continue;
  75.         usd[x] = 1;
  76.         if (pos[x].size() < 2) continue;
  77.         int l = *pos[x].begin();
  78.         int r = *(--pos[x].end());
  79.         for (int i = l; i <= r; ++i) {
  80.             int v= nocol.get(i - 1);
  81.             if (v != -1) {
  82.                 i = v;
  83.             }
  84.             if (i > r) break;
  85.             pos[a[i]].erase(i);
  86.         }
  87.         nocol.upd(l - 1, r, r);
  88.         ans.push_back({l, r, x});
  89.     }
  90.  
  91.     for (auto el : ans) {
  92.         int l = el[0];
  93.         int r = el[1];
  94.         if (nocol.get(l - 1) != r) continue;
  95.         int x = el[2];
  96.         for (int i = l; i <= r; ++i) {
  97.             a[i] = x;
  98.         }
  99.     }
  100.  
  101.     for (int i = 1; i <= n; ++i) {
  102.         cout << a[i] << ' ';
  103.     }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement