Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- /*
- #pragma GCC optimize ("O3")
- #pragma GCC target ("avx2")
- #pragma GCC target (sse, sse2, sse3, ssse3, sse4,popcnt,tune=native)
- */
- #define FOR(i, s, e) for(int i=s; i<e; i++)
- #define loop(i, n) for(int i=0; i<n; i++)
- #define CIN ios_base::sync_with_stdio(0); cin.tie(0)
- #define pb push_back
- #define ll long long int
- #define ull unsigned long long int
- #define ld long double
- #define SZ(a) (int)(a.size())
- #define Read() freopen("input.txt", "r", stdin)
- #define Write() freopen("output.txt", "w", stdout)
- #define mem(a, v) memset(a, v, sizeof(a))
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(), v.rend()
- #define Unique(x) x.erase(unique(all(x)), x.end())
- #define pi acos(-1.0)
- #define vec vector
- #define mp make_pair
- #define paii pair<int, int>
- #define padd pair<dd, dd>
- #define pall pair<ll, ll>
- #define fr first
- #define sc second
- //#define endl "\n"
- #define vec vector
- using namespace std;
- #define int long long
- const int inf = 1e12 + 47, MAXN = 3e5 + 47;
- struct node{
- int l, r, nv, mn;
- node(int p = -1) {
- l = r = -1;
- nv = -1;
- mn = inf;
- }
- };
- vec<int> a;
- vec<node> t(4 * MAXN);
- void build(int i, int l, int r) {
- t[i].l = l, t[i].r = r;
- if(l == r) {
- t[i].mn = a[l];
- return;
- }
- int mid = (l + r) / 2;
- build(i * 2, l, mid);
- build(i * 2 + 1, mid + 1, r);
- t[i].mn = min(t[i * 2].mn, t[i * 2 + 1].mn);
- }
- void push(int i) {
- if(t[i].nv == -1) return;
- if(t[i].l != t[i].r) {
- t[i * 2].nv = t[i * 2 + 1].nv = t[i].nv;
- }
- t[i].mn = t[i].nv;
- t[i].nv = -1;
- }
- void change(int i, int l, int r, int v) {
- push(i);
- if(l > t[i].r || t[i].l > r) return;
- if(l <= t[i].l && t[i].r <= r) {
- t[i].nv = v;
- push(i);
- return;
- }
- change(i * 2, l, r, v);
- change(i * 2 + 1, l, r, v);
- t[i].mn = min(t[i*2].mn, t[i * 2 + 1].mn);
- }
- int get_left(int i) {
- push(i);
- if(t[i].l == t[i].r) {
- return t[i].l;
- }
- if(t[i*2].mn <= t[i*2+1].mn) {
- return get_left(i * 2);
- } else {
- return get_left(i * 2 + 1);
- }
- }
- int get_right(int i) {
- push(i);
- if(t[i].l == t[i].r) {
- return t[i].l;
- }
- if(t[i*2].mn < t[i*2+1].mn) {
- return get_right(i * 2);
- } else {
- return get_right(i * 2 + 1);
- }
- }
- int get() {
- push(1);
- return t[1].mn;
- }
- int get_min(int i, int pos) {
- push(i);
- if(pos > t[i].r || pos < t[i].l) return inf;
- if(pos <= t[i].l && t[i].r <= pos) return t[i].mn;
- return min(get_min(i * 2, pos), get_min(i * 2 + 1, pos));
- }
- int n, cnt = 0;
- map<int, int> trans, rev;
- void read() {
- cin >> n;
- a.resize(n);
- loop(i, n) cin >> a[i];
- int q;
- cin >> q;
- loop(i, q) {
- int t;
- cin >> t;
- if(trans.find(t) != trans.end()) continue;
- trans[t] = cnt;
- rev[cnt] = t;
- cnt++;
- }
- int cock = cnt;
- loop(i, n) {
- if(trans.find(a[i]) == trans.end()) {
- trans[a[i]] = cnt;
- rev[cnt] = a[i];
- cnt++;
- }
- a[i] = trans[a[i]];
- }
- //loop(i, n) cout << a[i] << " ";
- //cout << endl;
- build(1, 0, n - 1);
- loop(i, cock) {
- if(get() > i) continue;
- int l = get_left(1), r = get_right(1);
- rev[cnt] = rev[i];
- change(1, l, r, cnt);
- cnt++;
- }
- loop(i, n) {
- int t = get_min(1, i);
- cout << rev[t] << " ";
- }
- cout << endl;
- }
- void solve() {
- }
- signed main()
- {
- CIN;
- int t = 1;
- //cin >> t;
- while(t--) {
- read();
- solve();
- }
- }
- /*
- 8
- 7 1 7 1 23 9 23 1
- 4
- 23 4 7 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement