Problem p02557 (C++) — buggy submission, verdict: Runtime Error

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// int n;
// int a[200005];
// int b[200005];
// map <int,int> ms;
// map <int,int> m1;
// map <int,int> m2;
// set <pii> squ;
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n;
//	for(int i=0;i<n;i++)
//	{
//		scanf("%d",a+i);
//		ms[a[i]]++;
//		m1[a[i]]++;
//	}
//	for(int i=0;i<n;i++)
//	{
//		scanf("%d",b+i);
//		ms[b[i]]++;
//		m2[b[i]]++;
//	}
//	for(auto &o:ms)
//	{
//		squ.insert(mp(o.second,o.first));
//	}
//	vector <pii> res;
//	for(int i=n;i>=1;i--)
//	{
//		pii o=*(--squ.end());
//		int x=o.second,s=o.first;
//		assert(s!=0);
//		assert(ms[x]==s);
////		if(s>i && i!=n) assert(false);
//		if(s>i) over("No");
////		cout<<ms<<endl;
////		cout<<m1<<endl;
////		cout<<m2<<endl;
////		cout<<"************************\\n";
//		if(m2.find(x)!=m2.end())
//		{
//			int
//ch=(m1.begin()->first==x?(++m1.begin())->first:m1.begin()->first);
//			res.push_back(mp(ch,x));
//			assert(squ.erase(mp(ms[x],x)));
////			assert(ms[x]>=0);
//			ms[x]--;
//			squ.insert(mp(ms[x],x));
//			assert(squ.erase(mp(ms[ch],ch)));
//			assert(ms[ch]>=0);
//			ms[ch]--;
//			squ.insert(mp(ms[ch],ch));
//			m1[ch]--;
//			if(m1[ch]==0) m1.erase(ch);
//			m2[x]--;
//			if(m2[x]==0) m2.erase(x);
//		}
//		else if(m1.find(x)!=m1.end())
//		{
//			int
//ch=(m2.begin()->first==x?(++m2.begin())->first:m2.begin()->first);
//			res.push_back(mp(x,ch));
//			assert(squ.erase(mp(ms[x],x)));
//			ms[x]--;
//			squ.insert(mp(ms[x],x));
//			assert(squ.erase(mp(ms[ch],ch)));
//			ms[ch]--;
//			squ.insert(mp(ms[ch],ch));
//			m1[x]--;
//			if(m1[x]==0) m1.erase(x);
//			m2[ch]--;
//			if(m2[ch]==0) m2.erase(ch);
//		}
//		else assert(false);
//	}
//	sort(all(res));
//	puts("Yes");
//	for(int i=0;i<n;i++)
//	{
//		printf("%d ",res[i].second);
//	}
//	puts("");
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 1e9 + 7;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, set<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2>
void operator+=(pair<T1, T2> &x, pair<T1, T2> y) {
  x.first += y.first;
  x.second += y.second;
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < (int)vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
int n;
int a[200005];
int b[200005];
map<int, int> ms;
map<int, int> m1;
map<int, int> m2;
set<pii> squ;

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n;
  for (int i = 0; i < n; i++) {
    scanf("%d", a + i);
    ms[a[i]]++;
    m1[a[i]]++;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", b + i);
    ms[b[i]]++;
    m2[b[i]]++;
  }
  for (auto &o : ms) {
    squ.insert(mp(o.second, o.first));
  }
  vector<pii> res;
  for (int i = n; i >= 1; i--) {
    pii o = *(--squ.end());
    int x = o.second, s = o.first;
    assert(s != 0);
    assert(ms[x] == s);
    //		if(s>i && i!=n) assert(false);
    if (s > i)
      over("No");
    //		cout<<ms<<endl;
    //		cout<<m1<<endl;
    //		cout<<m2<<endl;
    //		cout<<"************************\\n";
    if (m2.find(x) != m2.end()) {
      int ch =
          (m1.begin()->first == x ? (++m1.begin())->first : m1.begin()->first);
      res.push_back(mp(ch, x));
      assert(squ.erase(mp(ms[x], x)));
      //			assert(ms[x]>=0);
      ms[x]--;
      squ.insert(mp(ms[x], x));
      assert(squ.erase(mp(ms[ch], ch)));
      assert(ms[ch] >= 0);
      ms[ch]--;
      squ.insert(mp(ms[ch], ch));
      m1[ch]--;
      if (m1[ch] == 0)
        m1.erase(ch);
      m2[x]--;
      if (m2[x] == 0)
        m2.erase(x);
    } else if (m1.find(x) != m1.end()) {
      int ch =
          (m2.begin()->first == x ? (++m2.begin())->first : m2.begin()->first);
      res.push_back(mp(x, ch));
      assert(squ.erase(mp(ms[x], x)));
      ms[x]--;
      squ.insert(mp(ms[x], x));
      assert(squ.erase(mp(ms[ch], ch)));
      ms[ch]--;
      squ.insert(mp(ms[ch], ch));
      m1[x]--;
      if (m1[x] == 0)
        m1.erase(x);
      m2[ch]--;
      if (m2[ch] == 0)
        m2.erase(ch);
    } else
      assert(false);
  }
  sort(all(res));
  puts("Yes");
  for (int i = 0; i < n; i++) {
    printf("%d ", res[i].second);
  }
  puts("");
  return 0;
}


Error: WA

Fixed submission:

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// int n;
// int a[200005];
// int b[200005];
// map <int,int> ms;
// map <int,int> m1;
// map <int,int> m2;
// set <pii> squ;
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n;
//	for(int i=0;i<n;i++)
//	{
//		scanf("%d",a+i);
//		ms[a[i]]++;
//		m1[a[i]]++;
//	}
//	for(int i=0;i<n;i++)
//	{
//		scanf("%d",b+i);
//		ms[b[i]]++;
//		m2[b[i]]++;
//	}
//	for(auto &o:ms)
//	{
//		squ.insert(mp(o.second,o.first));
//	}
//	vector <pii> res;
//	for(int i=n;i>=1;i--)
//	{
//		pii o=*(--squ.end());
//		int x=o.second,s=o.first;
//		assert(s!=0);
//		assert(ms[x]==s);
////		if(s>i && i!=n) assert(false);
//		if(s>i) over("No");
////		cout<<ms<<endl;
////		cout<<m1<<endl;
////		cout<<m2<<endl;
////		cout<<"************************\\n";
//		if(m2[x])
//		{
//			int
//ch=(m1.begin()->first==x?(++m1.begin())->first:m1.begin()->first);
//			res.push_back(mp(ch,x));
//			assert(squ.erase(mp(ms[x],x)));
////			assert(ms[x]>=0);
//			ms[x]--;
//			squ.insert(mp(ms[x],x));
//			assert(squ.erase(mp(ms[ch],ch)));
//			assert(ms[ch]>=0);
//			ms[ch]--;
//			squ.insert(mp(ms[ch],ch));
//			m1[ch]--;
//			if(m1[ch]==0) m1.erase(ch);
//			m2[x]--;
//			if(m2[x]==0) m2.erase(x);
//		}
//		else if(m1[x])
//		{
//			int
//ch=(m2.begin()->first==x?(++m2.begin())->first:m2.begin()->first);
//			res.push_back(mp(x,ch));
//			assert(squ.erase(mp(ms[x],x)));
//			ms[x]--;
//			squ.insert(mp(ms[x],x));
//			assert(squ.erase(mp(ms[ch],ch)));
//			ms[ch]--;
//			squ.insert(mp(ms[ch],ch));
//			m1[x]--;
//			if(m1[x]==0) m1.erase(x);
//			m2[ch]--;
//			if(m2[ch]==0) m2.erase(ch);
//		}
//		else assert(false);
//	}
//	sort(all(res));
//	puts("Yes");
//	for(int i=0;i<n;i++)
//	{
//		printf("%d ",res[i].second);
//	}
//	puts("");
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 1e9 + 7;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, set<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2>
void operator+=(pair<T1, T2> &x, pair<T1, T2> y) {
  x.first += y.first;
  x.second += y.second;
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < (int)vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
int n;
int a[200005];
int b[200005];
map<int, int> ms;
map<int, int> m1;
map<int, int> m2;
set<pii> squ;

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n;
  for (int i = 0; i < n; i++) {
    scanf("%d", a + i);
    ms[a[i]]++;
    m1[a[i]]++;
  }
  for (int i = 0; i < n; i++) {
    scanf("%d", b + i);
    ms[b[i]]++;
    m2[b[i]]++;
  }
  for (auto &o : ms) {
    squ.insert(mp(o.second, o.first));
  }
  vector<pii> res;
  for (int i = n; i >= 1; i--) {
    pii o = *(--squ.end());
    int x = o.second, s = o.first;
    assert(s != 0);
    assert(ms[x] == s);
    //		if(s>i && i!=n) assert(false);
    if (s > i)
      over("No");
    //		cout<<ms<<endl;
    //		cout<<m1<<endl;
    //		cout<<m2<<endl;
    //		cout<<"************************\\n";
    if (m2[x]) {
      int ch =
          (m1.begin()->first == x ? (++m1.begin())->first : m1.begin()->first);
      res.push_back(mp(ch, x));
      assert(squ.erase(mp(ms[x], x)));
      //			assert(ms[x]>=0);
      ms[x]--;
      squ.insert(mp(ms[x], x));
      assert(squ.erase(mp(ms[ch], ch)));
      assert(ms[ch] >= 0);
      ms[ch]--;
      squ.insert(mp(ms[ch], ch));
      m1[ch]--;
      if (m1[ch] == 0)
        m1.erase(ch);
      m2[x]--;
      if (m2[x] == 0)
        m2.erase(x);
    } else if (m1[x]) {
      int ch =
          (m2.begin()->first == x ? (++m2.begin())->first : m2.begin()->first);
      res.push_back(mp(x, ch));
      assert(squ.erase(mp(ms[x], x)));
      ms[x]--;
      squ.insert(mp(ms[x], x));
      assert(squ.erase(mp(ms[ch], ch)));
      ms[ch]--;
      squ.insert(mp(ms[ch], ch));
      m1[x]--;
      if (m1[x] == 0)
        m1.erase(x);
      m2[ch]--;
      if (m2[ch] == 0)
        m2.erase(ch);
    } else
      assert(false);
  }
  sort(all(res));
  puts("Yes");
  for (int i = 0; i < n; i++) {
    printf("%d ", res[i].second);
  }
  puts("");
  return 0;
}