Problem p01412 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <deque>
#include <iostream>

#include <array>
#include <cmath>
#include <map>

using namespace std;

// const int T=5;

// array<int,T> a;
// map<array<int,T>,array<int,T> > m;

// double pow(array<int,T> a){
//   double d=a[T-1];
//   for(int x=T-2;x>=0;x--){
//     d=(a[x]==0&&d==0)?1:pow(a[x],d);
//   }
//   return d;
// }

// void dfs(int d){
//   if(d<T){
//     for(int i=0;i<T;i++){
//       a[d]=i;
//       dfs(d+1);
//     }
//   }else{
//     auto c=a;
//     sort(begin(c),end(c));
//     if(m.count(c)==0||pow(m[c])<pow(a)-.5){
//       m[c]=a;
//     }
//   }
// }

// int main(){
//   dfs(0);
//   for(auto e:m){
//     for(auto f:e.second){
//       cout<<f<<' ';
//     }
//     cout<<pow(e.second)<<endl;
//   }
// }

int main() {
  int N;
  cin >> N;
  deque<int> deq(N);
  for (int i = 0; i < N; i++) {
    cin >> deq[i];
  }
  sort(begin(deq), end(deq));
  deque<int> ans;

  auto o = find(begin(deq), end(deq), 1);
  if (o != end(deq) && (o - begin(deq)) % 2) {
    swap(*o, o[-1]);
  }
  while (!deq.empty() && deq[0] <= 1) {
    ans.push_back(deq[0]);
    deq.pop_front();
  }
  int nzf = 0;
  while (nzf < ans.size() && ans[nzf] == 0) {
    nzf++;
  }
  if (nzf % 2) {
    ans.push_front(deq[0]);
    deq.pop_front();
  }
  while (!deq.empty() && deq[0] == 1) {
    ans.push_front(deq[0]);
    deq.pop_front();
  }
  if (deq.size() >= 2 && deq.back() == 3 && deq[deq.size() - 2] == 2) {
    swap(deq[deq.size() - 2], deq[deq.size() - 1]);
  }
  ans.insert(begin(ans), begin(deq), end(deq));
  for (auto e : ans) {
    cout << e << endl;
  }
}


Fixed submission:
#include <algorithm>
#include <deque>
#include <iostream>

#include <array>
#include <cmath>
#include <map>

using namespace std;

// const int T=5;

// array<int,T> a;
// map<array<int,T>,array<int,T> > m;

// double pow(array<int,T> a){
//   double d=a[T-1];
//   for(int x=T-2;x>=0;x--){
//     d=(a[x]==0&&d==0)?1:pow(a[x],d);
//   }
//   return d;
// }

// void dfs(int d){
//   if(d<T){
//     for(int i=0;i<T;i++){
//       a[d]=i;
//       dfs(d+1);
//     }
//   }else{
//     auto c=a;
//     sort(begin(c),end(c));
//     if(m.count(c)==0||pow(m[c])<pow(a)-.5){
//       m[c]=a;
//     }
//   }
// }

// int main(){
//   dfs(0);
//   for(auto e:m){
//     for(auto f:e.second){
//       cout<<f<<' ';
//     }
//     cout<<pow(e.second)<<endl;
//   }
// }

int main() {
  int N;
  cin >> N;
  deque<int> deq(N);
  for (int i = 0; i < N; i++) {
    cin >> deq[i];
  }
  sort(begin(deq), end(deq));
  deque<int> ans;

  if (deq[0] <= 1) {
    int no = count(begin(deq), end(deq), 1);
    auto p = upper_bound(begin(deq), end(deq), 1);
    auto o = lower_bound(begin(deq), end(deq), 1);
    if (o != end(deq) && (o - begin(deq)) % 2) {
      swap(*o, o[-1]);
      if (o == p) {
        p++;
      }
    }
    ans.insert(begin(ans), begin(deq), p);
    deq.erase(begin(deq), p);
  }
  if (deq.size() >= 2 && deq.back() == 3 && deq[deq.size() - 2] == 2) {
    swap(deq[deq.size() - 2], deq[deq.size() - 1]);
  }
  ans.insert(begin(ans), begin(deq), end(deq));
  for (auto e : ans) {
    cout << e << endl;
  }
}