Problem p03938 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define SORT(x) sort((x).begin(), (x).end())
#define ALL(x) (x).begin(), (x).end()
#define rep(i, n) for (ll i = 0; i < n; i++)
#define reps(i, m, n) for (ll i = m; i < n; i++)
#define repr(i, m, n) for (ll i = m; i >= n; i--)
#define de(x) cout << #x << "=" << x << endl;
template <class T> bool maxi(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool mini(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
#define INF2 1000000000000000037
#define INF 1000000007
#define MOD 1000000007
#define PI (acos(-1))
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<ll, ll>;
//--GLOBAL---------------------------------
struct edge {
  ll to, cost;
}; // edgeパラメータ
struct graph {
  ll N;                   // ノードの個数
  vector<vector<edge>> G; // G[辺の元]((.to辺の先,.costコスト),...)
  vector<ll> d;           // dist[n] = ノードnまでのの重み
  vector<ll> parent;

  graph(ll n) : N(n), G(N), d(n, INF2), parent(N) {}

  void add_edge(ll s, ll t, ll cost) {
    G[s].emplace_back((edge){t, cost});
    G[t].emplace_back((edge){s, cost}); // 無向ならON
  }

  void dijkstra(ll s) {
    d[s] = 0;
    priority_queue<P, vector<P>, greater<P>> que; // ansが小さい順に出る
    que.push(P(0, s));                            // P < ans , Node >
    while (!que.empty()) {
      P p = que.top();
      que.pop();       // pに <ans,Node> 入れる
      ll v = p.second; // vに Node 入れる
      if (d[v] < p.first)
        continue; // すでに良い数値が入っているならパス
      rep(i, G[v].size()) {
        edge &E = G[v][i];
        if (d[E.to] > d[v] + E.cost) { // 更新するなら
          d[E.to] = d[v] + E.cost;
          parent[E.to] = v; // 親を記録,goalから遡れば道順
          que.push(P(d[E.to], E.to));
        }
      }
    }
  }
};

//--MAIN-----------------------------------
void Main() {
  ll N;
  cin >> N;
  vector<ll> p(N);
  rep(i, N) cin >> p[i];
  rep(i, N)-- p[i];

  vector<ll> aplus(N, 0);
  vector<ll> bplus(N, 0);

  rep(i, N) {
    if (p[i] + 1 != N)
      aplus[p[i] + 1] = 20001 - i;
    if (p[i] - 1 != N)
      bplus[p[i] - 1] = 20001 - i;
  }
  reps(i, 1, N) {
    aplus[i] += aplus[i - 1];
    bplus[N - 1 - i] += bplus[N - i];
  }
  rep(i, N) { cout << i + 1 + aplus[i] << " "; }
  cout << "\n";
  rep(i, N) { cout << N - i + bplus[i] << " "; }
  cout << "\n";
}
//--START----------------------------------
int main() {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(15);
  Main();
}
//-----------------------------------------


Fixed submission:
#include <bits/stdc++.h>
#define SORT(x) sort((x).begin(), (x).end())
#define ALL(x) (x).begin(), (x).end()
#define rep(i, n) for (ll i = 0; i < n; i++)
#define reps(i, m, n) for (ll i = m; i < n; i++)
#define repr(i, m, n) for (ll i = m; i >= n; i--)
#define de(x) cout << #x << "=" << x << endl;
template <class T> bool maxi(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool mini(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
#define INF2 1000000000000000037
#define INF 1000000007
#define MOD 1000000007
#define PI (acos(-1))
using namespace std;
using ll = long long;
using ld = long double;
using P = pair<ll, ll>;
//--GLOBAL---------------------------------
struct edge {
  ll to, cost;
}; // edgeパラメータ
struct graph {
  ll N;                   // ノードの個数
  vector<vector<edge>> G; // G[辺の元]((.to辺の先,.costコスト),...)
  vector<ll> d;           // dist[n] = ノードnまでのの重み
  vector<ll> parent;

  graph(ll n) : N(n), G(N), d(n, INF2), parent(N) {}

  void add_edge(ll s, ll t, ll cost) {
    G[s].emplace_back((edge){t, cost});
    G[t].emplace_back((edge){s, cost}); // 無向ならON
  }

  void dijkstra(ll s) {
    d[s] = 0;
    priority_queue<P, vector<P>, greater<P>> que; // ansが小さい順に出る
    que.push(P(0, s));                            // P < ans , Node >
    while (!que.empty()) {
      P p = que.top();
      que.pop();       // pに <ans,Node> 入れる
      ll v = p.second; // vに Node 入れる
      if (d[v] < p.first)
        continue; // すでに良い数値が入っているならパス
      rep(i, G[v].size()) {
        edge &E = G[v][i];
        if (d[E.to] > d[v] + E.cost) { // 更新するなら
          d[E.to] = d[v] + E.cost;
          parent[E.to] = v; // 親を記録,goalから遡れば道順
          que.push(P(d[E.to], E.to));
        }
      }
    }
  }
};

//--MAIN-----------------------------------
void Main() {
  ll N;
  cin >> N;
  vector<ll> p(N);
  rep(i, N) cin >> p[i];
  rep(i, N)-- p[i];

  vector<ll> aplus(N, 0);
  vector<ll> bplus(N, 0);

  rep(i, N) {
    if (p[i] + 1 != N)
      aplus[p[i] + 1] = 20001 - i;
    if (p[i] - 1 != -1)
      bplus[p[i] - 1] = 20001 - i;
  }
  reps(i, 1, N) {
    aplus[i] += aplus[i - 1];
    bplus[N - 1 - i] += bplus[N - i];
  }
  rep(i, N) { cout << i + 1 + aplus[i] << " "; }
  cout << "\n";
  rep(i, N) { cout << N - i + bplus[i] << " "; }
  cout << "\n";
}
//--START----------------------------------
int main() {
  cin.tie(nullptr);
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(15);
  Main();
}
//-----------------------------------------