Problem p04050 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <stdio.h>

#define pb push_back
#define pf push_front
#define pp pop_back
#define sz(a) (int)(a.size())
#define mp make_pair
#define F first
#define S second
#define next _next
#define prev _prev
#define left _left
#define right _right
#define y1 _y1
#define all(x) x.begin(), x.end()
#define what_is(x) #x << " is " << (x)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int N = (int)1e6 + 123;
const ll INF = (ll)1e18 + 123;
const int inf = (int)1e9 + 123;
const int MOD = (int)1e9 + 7;

void megaRandom() {
  unsigned int FOR;
  asm("rdtsc" : "=A"(FOR));
  srand(FOR);
}

int n, m, a[211];

int main() {
  megaRandom();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++)
    scanf("%d", &a[i]);
  sort(a + 1, a + m + 1);
  if (n == 1) {
    printf("1\n1\n1");
    return 0;
  }
  if (m == 1) {
    printf("%d\n2\n%d 1", a[1], a[1] - 1);
    return 0;
  }
  if (m == 2) {
    printf("%d %d\n", a[1], a[2]);
    if (a[2] == 1)
      printf("1\n%d", n);
    else
      printf("2\n%d %d", a[1] + 1, a[2] - 1);
    return 0;
  }
  vector<int> v;
  for (int i = 1; i <= m; i++)
    if (a[i] & 1)
      v.pb(i);
  if (sz(v)) {
    if (!(a[1] & 1))
      swap(a[v.back()], a[1]);
    if (!(a[m] & 1))
      swap(a[v.back()], a[m]);
    v.pp();
  }
  if (sz(v)) {
    if (!(a[1] & 1))
      swap(a[v.back()], a[1]);
    if (!(a[m] & 1))
      swap(a[v.back()], a[m]);
    v.pp();
  }
  if (sz(v)) {
    puts("Impossible");
    return 0;
  }
  // if(a[2] % 2 && a[1] % 2 && a[m] % 2)
  // assert(0);
  for (int i = 1; i <= m; i++)
    printf("%d ", a[i]);
  printf("\n");
  if (a[m] == 1) {
    assert(0);
    if (m == 3) {
      assert(0);
      printf("2\n%d %d", a[1] + 1, n - a[1] - 1);
      return 0;
    }
    if (m == 4) {
      assert(0);
      return 0;
    }
    swap(a[2], a[m]);
    assert((a[m] & 1) == 0);
    a[1]++, a[m]--;
    printf("%d\n", m);
    for (int i = 1; i <= m; i++)
      printf("%d ", a[i]);
    return 0;
  }

  a[1]++, a[m]--;
  printf("%d\n", m);
  for (int i = 1; i <= m; i++)
    printf("%d ", a[i]);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#include <stdio.h>

#define pb push_back
#define pf push_front
#define pp pop_back
#define sz(a) (int)(a.size())
#define mp make_pair
#define F first
#define S second
#define next _next
#define prev _prev
#define left _left
#define right _right
#define y1 _y1
#define all(x) x.begin(), x.end()
#define what_is(x) #x << " is " << (x)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int N = (int)1e6 + 123;
const ll INF = (ll)1e18 + 123;
const int inf = (int)1e9 + 123;
const int MOD = (int)1e9 + 7;

void megaRandom() {
  unsigned int FOR;
  asm("rdtsc" : "=A"(FOR));
  srand(FOR);
}

int n, m, a[211];

int main() {
  megaRandom();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++)
    scanf("%d", &a[i]);
  sort(a + 1, a + m + 1);
  if (n == 1) {
    printf("1\n1\n1");
    return 0;
  }
  if (m == 1) {
    printf("%d\n2\n%d 1", a[1], a[1] - 1);
    return 0;
  }
  if (m == 2) {
    printf("%d %d\n", a[1], a[2]);
    if (a[2] == 1)
      printf("1\n%d", n);
    else
      printf("2\n%d %d", a[1] + 1, a[2] - 1);
    return 0;
  }
  vector<int> v;
  for (int i = 1; i <= m; i++)
    if (a[i] & 1)
      v.pb(i);
  if (sz(v)) {
    if (!(a[1] & 1))
      swap(a[v.back()], a[1]);
    if (!(a[m] & 1))
      swap(a[v.back()], a[m]);
    v.pp();
  }
  if (sz(v)) {
    if (!(a[1] & 1))
      swap(a[v.back()], a[1]);
    if (!(a[m] & 1))
      swap(a[v.back()], a[m]);
    v.pp();
  }
  if (sz(v)) {
    puts("Impossible");
    return 0;
  }
  // if(a[2] % 2 && a[1] % 2 && a[m] % 2)
  // assert(0);
  for (int i = 1; i <= m; i++)
    printf("%d ", a[i]);
  printf("\n");
  if (a[m] == 1) {
    a[1]++;
    printf("%d\n", m - 1);
    for (int i = 1; i < m; i++)
      printf("%d ", a[i]);
    return 0;
  }

  a[1]++, a[m]--;
  printf("%d\n", m);
  for (int i = 1; i <= m; i++)
    printf("%d ", a[i]);
  return 0;
}