Problem p02557 (C++)

Buggy submission (status: Runtime Error):
/*input
10
1 1 5 1 4 5 5 4 9 4
1 4 9 9 8 2 1 8 2 1
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (ll i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 2e5 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = 3.14159265358979323846;
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \
  (sort(c.begin(), c.end()),                                                   \
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) { return (a * b) % MOD; }
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
int a[maxn], b[maxn], cnt[maxn], cnt2[maxn];
int nxt[maxn];
int lst[maxn];
vector<int> v[maxn];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  srand(time(NULL));
  int n;
  cin >> n;
  REP(i, n) cin >> a[i], cnt2[a[i]]++, v[a[i]].pb(i);
  REP1(i, n) v[i].pb(INF);
  REP(i, n) {
    cin >> b[i], cnt[b[i]]++;
    // cout<<b[i]<<' ';
  }
  // cout<<'\n';
  // REP(i,n) cout<<a[i]<<' ';
  // cout<<'\n';
  set<pair<pair<pii, int>, int>> s;
  REP1(i, n) if (cnt[i] + cnt2[i] > n) {
    cout << "No\n";
    return 0;
  }
  reverse(b, b + n);
  vector<int> v;
  int x = -1;
  REP(i, n) {
    if (a[i] == b[i])
      v.pb(i), x = i;
  }
  if (x != -1) {
    REP(i, n) {
      if (a[i] != x and b[i] != x) {
        swap(b[i], b[v.back()]);
        v.pop_back();
      }
      if (!sz(v))
        break;
    }
  }
  cout << "Yes\n";
  REP(i, n) {
    assert(a[i] != b[i]);
    cout << b[i] << ' ';
  }
}


Fixed submission:
/*input
10
1 1 5 1 4 5 5 4 9 4
1 4 9 9 8 2 1 8 2 1
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (ll i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 2e5 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = 3.14159265358979323846;
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \
  (sort(c.begin(), c.end()),                                                   \
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) { return (a * b) % MOD; }
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
int a[maxn], b[maxn], cnt[maxn], cnt2[maxn];
int nxt[maxn];
int lst[maxn];
vector<int> v[maxn];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  srand(time(NULL));
  int n;
  cin >> n;
  REP(i, n) cin >> a[i], cnt2[a[i]]++, v[a[i]].pb(i);
  REP1(i, n) v[i].pb(INF);
  REP(i, n) {
    cin >> b[i], cnt[b[i]]++;
    // cout<<b[i]<<' ';
  }
  // cout<<'\n';
  // REP(i,n) cout<<a[i]<<' ';
  // cout<<'\n';
  set<pair<pair<pii, int>, int>> s;
  REP1(i, n) if (cnt[i] + cnt2[i] > n) {
    cout << "No\n";
    return 0;
  }
  reverse(b, b + n);
  vector<int> v;
  int x = -1;
  REP(i, n) {
    if (a[i] == b[i])
      v.pb(i), x = a[i];
  }
  if (x != -1) {
    REP(i, n) {
      if (a[i] != x and b[i] != x) {
        swap(b[i], b[v.back()]);
        v.pop_back();
      }
      if (!sz(v))
        break;
    }
  }
  cout << "Yes\n";
  REP(i, n) {
    assert(a[i] != b[i]);
    cout << b[i] << ' ';
  }
}