Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int MAXN = 4e5;
- int a[MAXN];
- //int nocol[MAXN];
- int usd[MAXN];
- class SegTree {
- private:
- int n;
- vector<int> tree;
- void push(int v, int l, int r) {
- if (l == r + 1) return;
- if (tree[v] == -1) return;
- tree[2 * v + 1] = tree[v];
- tree[2 * v + 2] = tree[v];
- }
- void upd(int v, int l, int r, int L, int R, int val) {
- push(v, l, r);
- if (L <= l && r <= R) {
- tree[v] = val;
- return;
- }
- if (R <= l || r <= L) {
- return;
- }
- int m = (r + l) / 2;
- upd(2 * v + 1, l, m, L, R, val);
- upd(2 * v + 2, m, r, L, R, val);
- }
- public:
- int get(int i) {
- int v = 0, l = 0, r = n;
- int ans = -1;
- while (true) {
- push(v, l, r);
- ans = tree[v];
- if (l == r - 1) break;
- int m = (r + l) / 2;
- if (i < m) {
- v = 2 * v + 1;
- r = m;
- } else {
- v = 2 * v + 2;
- l = m;
- }
- }
- return ans;
- }
- void upd(int l, int r, int x) {
- upd(0, 0, n, l, r, x);
- }
- SegTree (int n) {
- this->n = n;
- tree.assign(4 * n, -1);
- }
- };
- set<int> pos[MAXN];
- void solve() {
- //code here
- int n;
- cin >> n;
- for (int i = 1; i <= n; ++i) {
- cin >> a[i];
- pos[a[i]].insert(i);
- }
- int m;
- cin >> m;
- SegTree nocol(5 * n + 100);
- vector<vector<int>> ans;
- for (int q = 0; q < m; ++q) {
- int x;
- cin >> x;
- if (usd[x]) continue;
- usd[x] = 1;
- if (pos[x].size() < 2) continue;
- int l = *pos[x].begin();
- int r = *(--pos[x].end());
- for (int i = l; i <= r; ++i) {
- int v= nocol.get(i - 1);
- if (v != -1) {
- i = v;
- }
- if (i > r) break;
- pos[a[i]].erase(i);
- }
- nocol.upd(l - 1, r, r);
- ans.push_back({l, r, x});
- }
- for (auto el : ans) {
- int l = el[0];
- int r = el[1];
- if (nocol.get(l - 1) != r) continue;
- int x = el[2];
- for (int i = l; i <= r; ++i) {
- a[i] = x;
- }
- }
- for (int i = 1; i <= n; ++i) {
- cout << a[i] << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement