Problem:
Score : 600 points

Problem Statement

Given are two sequences A and B, both of length N.
A and B are each sorted in the ascending order.
Check if it is possible to reorder the terms of B so that for each i (1 \leq i \leq N) A_i \neq B_i holds, and if it is possible, output any of the reorderings that achieve it.

Constraints

1\leq N \leq 2 \times 10^5

1\leq A_i,B_i \leq N

A and B are each sorted in the ascending order.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \cdots A_N
B_1 B_2 \cdots B_N

Output

If there exist no reorderings that satisfy the condition, print No.

If there exists a reordering that satisfies the condition, print Yes on the first line.
After that, print a reordering of B on the second line, separating terms with a whitespace.

If there are multiple reorderings that satisfy the condition, you can print any of them.

Sample Input 1

6
1 1 1 2 2 3
1 1 1 2 2 3

Sample Output 1

Yes
2 2 3 1 1 1

Sample Input 2

3
1 1 2
1 1 3

Sample Output 2

No

Sample Input 3

4
1 1 2 3
1 2 3 3

Sample Output 3

Yes
3 3 1 2

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define repl(i, l, r) for (ll i = (l); i < (r); i++)
#define rep(i, n) repl(i, 0, n)
#define CST(x) cout << fixed << setprecision(x)
using ll = long long;
const ll MOD = 1000000007;
const int inf = 1e9 + 10;
const ll INF = 4e18 + 10;
const int dx[9] = {1, 0, -1, 0, 1, -1, -1, 1, 0};
const int dy[9] = {0, 1, 0, -1, 1, 1, -1, -1, 0};
int main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);
	int n;
	cin >> n;
	int a[n], b[n];
	rep(i, n) cin >> a[i];
	map<int, int> m;
	set<int> s;
	rep(i, n) {
		cin >> b[i];
		m[b[i]]++;
		s.insert(b[i]);
	}
	vector<int> ans(n);
	bool flag = 0;
	rep(i, n) {
		if (s.count(a[i]) == 0) continue;
		auto t = s.upper_bound(a[i]);
		if (t == s.end()) flag = 1;
		if (flag) {
			int l = *s.begin();
			if (l == a[i]) {
				cout << "No" << endl;
				return 0;
			}
			ans[i] = l;
			m[l]--;
			if (m[l] == 0) {
				m.erase(l);
				s.erase(l);
			}
		} else {
			int l = *s.upper_bound(a[i]);
			if (l == a[i]) {
				cout << "No" << endl;
				return 0;
			}
			ans[i] = l;
			m[l]--;
			if (m[l] == 0) {
				m.erase(l);
				s.erase(l);
			}
		}
	}
	rep(i, n) {
		if (ans[i]) continue;
		int l = *s.begin();
		if (l == a[i]) {
			cout << "No" << endl;
			return 0;
		}
		ans[i] = l;
		m[l]--;
		if (m[l] == 0) {
			m.erase(l);
			s.erase(l);
		}
	}
	cout << "Yes" << endl;
	rep(i, n) {
		if (i) cout << " ";
		cout << ans[i];
	}
	cout << endl;
	return 0;
}