Problem p03007 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
typedef long long int lint;
typedef pair<lint, lint> plint;
typedef pair<double long, double long> pld;
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((lint)(x).size())
#define POW2(n) (1LL << (n))
#define FOR(i, begin, end)                                                     \
  for (lint i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \
  for (lint i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
const lint MOD = 1e9 + 7, INF = 1e18, MAX_N = 200000;

lint N, arr[100000], sum = 0;
priority_queue<lint> mns, pls, zero;
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cin >> N;
  REP(i, N) {
    cin >> arr[i];
    if (arr[i] > 0)
      pls.push(-arr[i]);
    else if (arr[i] < 0)
      mns.push(arr[i]);
    else
      zero.push(0);
    sum += abs(arr[i]);
  }
  if (SZ(pls) == N) {
    lint minv = -pls.top();
    pls.pop();
    cout << sum - 2 * minv << endl;
    lint tmp = minv;
    REP(i, N - 2) {
      cout << tmp << " ";
      pls.pop();
      cout << -pls.top() << endl;
      tmp += pls.top();
    }
    cout << minv << " " << tmp << endl;
  } else if (SZ(mns) == N) {
    cout << sum + 2 * mns.top() << endl;
    lint tmp = mns.top();
    REP(i, N - 1) {
      cout << tmp << " ";
      mns.pop();
      cout << mns.top() << endl;
      tmp -= mns.top();
    }
  } else {
    if (SZ(pls) == 0) {
      REP(i, SZ(zero)) pls.push(0);
    } else {
      REP(i, SZ(zero)) mns.push(0);
    }
    cout << sum << endl;
    lint ld = -pls.top();
    lint tmp = mns.top();
    REP(i, SZ(pls) - 1) {
      cout << tmp << " ";
      pls.pop();
      cout << -pls.top() << endl;
      tmp -= -pls.top();
    }
    cout << ld << " " << tmp << endl;
    ld -= tmp;
    tmp = ld;
    REP(i, SZ(mns) - 1) {
      cout << tmp << " ";
      mns.pop();
      cout << mns.top() << endl;
      tmp -= mns.top();
    }
  }
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
typedef long long int lint;
typedef pair<lint, lint> plint;
typedef pair<double long, double long> pld;
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((lint)(x).size())
#define POW2(n) (1LL << (n))
#define FOR(i, begin, end)                                                     \
  for (lint i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \
  for (lint i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
const lint MOD = 1e9 + 7, INF = 1e18, MAX_N = 200000;

lint N, arr[100000], sum = 0;
priority_queue<lint> mns, pls, zero;
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cin >> N;
  REP(i, N) {
    cin >> arr[i];
    if (arr[i] > 0)
      pls.push(-arr[i]);
    else if (arr[i] < 0)
      mns.push(arr[i]);
    else
      zero.push(0);
    sum += abs(arr[i]);
  }
  if (SZ(pls) == N) {
    lint minv = -pls.top();
    pls.pop();
    cout << sum - 2 * minv << endl;
    lint tmp = minv;
    REP(i, N - 2) {
      cout << tmp << " ";
      pls.pop();
      cout << -pls.top() << endl;
      tmp += pls.top();
    }
    cout << minv << " " << tmp << endl;
  } else if (SZ(mns) == N) {
    cout << sum + 2 * mns.top() << endl;
    lint tmp = mns.top();
    REP(i, N - 1) {
      cout << tmp << " ";
      mns.pop();
      cout << mns.top() << endl;
      tmp -= mns.top();
    }
  } else {

    if (SZ(pls) == 0 && SZ(mns) == 0) {
      REP(i, SZ(zero) - 1) pls.push(0);
      mns.push(0);
    } else if (SZ(pls) == 0) {
      REP(i, SZ(zero)) pls.push(0);
    } else {
      REP(i, SZ(zero)) mns.push(0);
    }
    cout << sum << endl;
    lint ld = -pls.top();
    lint tmp = mns.top();
    REP(i, SZ(pls) - 1) {
      cout << tmp << " ";
      pls.pop();
      cout << -pls.top() << endl;
      tmp -= -pls.top();
    }
    cout << ld << " " << tmp << endl;
    ld -= tmp;
    tmp = ld;
    REP(i, SZ(mns) - 1) {
      cout << tmp << " ";
      mns.pop();
      cout << mns.top() << endl;
      tmp -= mns.top();
    }
  }
}