Problem p02928 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, NAME, ...) NAME
#define pr(...)                                                                \
  cerr << GET_MACRO(__VA_ARGS__, pr8, pr7, pr6, pr5, pr4, pr3, pr2,            \
                    pr1)(__VA_ARGS__)                                          \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define prArr(a)                                                               \
  {                                                                            \
    cerr << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      cerr << (i++ ? ", " : "") << t;                                          \
    cerr << "}" << endl;                                                       \
  }
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}

template <typename T, T MOD = 1000000007> struct Mint {
  static constexpr T mod = MOD;
  T v;
  Mint() : v(0) {}
  Mint(signed v) : v(v) {}
  Mint(long long t) {
    v = t % MOD;
    if (v < 0)
      v += MOD;
  }

  Mint pow(long long k) {
    Mint res(1), tmp(v);
    while (k) {
      if (k & 1)
        res *= tmp;
      tmp *= tmp;
      k >>= 1;
    }
    return res;
  }

  static Mint add_identity() { return Mint(0); }
  static Mint mul_identity() { return Mint(1); }

  Mint inv() { return pow(MOD - 2); }

  Mint &operator+=(Mint a) {
    v += a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator-=(Mint a) {
    v += MOD - a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator*=(Mint a) {
    v = 1LL * v * a.v % MOD;
    return *this;
  }
  Mint &operator/=(Mint a) { return (*this) *= a.inv(); }

  Mint operator+(Mint a) const { return Mint(v) += a; };
  Mint operator-(Mint a) const { return Mint(v) -= a; };
  Mint operator*(Mint a) const { return Mint(v) *= a; };
  Mint operator/(Mint a) const { return Mint(v) /= a; };

  Mint operator-() const { return v ? Mint(MOD - v) : Mint(v); }

  bool operator==(const Mint a) const { return v == a.v; }
  bool operator!=(const Mint a) const { return v != a.v; }
  bool operator<(const Mint a) const { return v < a.v; }

  // find x s.t. a^x = b
  static T log(T a, T b) {
    const T sq = 40000;
    unordered_map<T, T> dp;
    dp.reserve(sq);
    Mint res(1);
    for (Int r = 0; r < sq; r++) {
      if (!dp.count(res.v))
        dp[res.v] = r;
      res *= a;
    }
    Mint p = Mint(a).inv().pow(sq);
    res = b;
    for (Int q = 0; q <= MOD / sq + 1; q++) {
      if (dp.count(res.v)) {
        T idx = q * sq + dp[res.v];
        if (idx > 0)
          return idx;
      }
      res *= p;
    }
    assert(0);
    return T(-1);
  }

  static Mint comb(long long n, Int k) {
    Mint num(1), dom(1);
    for (Int i = 0; i < k; i++) {
      num *= Mint(n - i);
      dom *= Mint(i + 1);
    }
    return num / dom;
  }
};
template <typename T, T MOD> constexpr T Mint<T, MOD>::mod;
template <typename T, T MOD> ostream &operator<<(ostream &os, Mint<T, MOD> m) {
  os << m.v;
  return os;
}

// INSERT ABOVE HERE

using mint = Mint<Int, mod>;

template <typename T> class CumulativeSum {
public:
  Int n;
  vector<T> sum;
  vector<T> A;
  Int added;
  CumulativeSum() : n(-1), added(0) {}
  CumulativeSum(Int n) : n(n), sum(n + 1), A(n + 1), added(0) {}
  CumulativeSum(const vector<T> &B)
      : n(B.size()), sum(n + 1), A(n + 1), added(0) {
    for (Int i = 1; i <= n; i++)
      sum[i] = sum[i - 1] + B[i - 1];
  }

  void apply() {
    for (Int i = 1; i <= n; i++)
      A[i] = A[i] + A[i - 1];
    for (Int i = 1; i <= n; i++)
      A[i] = A[i] + A[i - 1];
    for (Int i = 1; i <= n; i++)
      sum[i] = sum[i] + A[i - 1];
    added = 0;
    A.clear();
    A.resize(n + 1);
  }

  //[l, r)にxを加算
  void add(Int l, Int r, T x) {
    added = 1;
    assert(l <= r && 0 <= l && r <= n);
    A[l] = A[l] + x;
    A[r] = A[r] - x;
  }

  //[l, r)の和を得る
  T get(Int l, Int r) {
    assert(l <= r && 0 <= l && r <= n);
    if (added)
      apply();
    return sum[r] - sum[l];
  }
};

Int calc(vector<Int> A) {
  Int N = A.size();
  Int cnt = 0;
  for (Int i = 0; i < N; i++)
    for (Int j = i + 1; j < N; j++)
      if (A[i] > A[j])
        cnt++;
  return cnt;
}

using T = mint;
pair<vector<T>, mint> calc(vector<T> A, vector<T> B) {

  CumulativeSum<T> sumA(A);
  CumulativeSum<T> sumB(B);
  vector<T> res(A.size());

  const Int N = A.size();
  mint cost = 0;
  for (Int i = 0; i < (Int)A.size(); i++) {
    if (B[i] == 0)
      continue;
    res[i] = A[i] + B[i];
    cost += mint(sumA.get(i + 1, N)) * mint(B[i]);
  }
  return {res, cost};
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int N, K;
  cin >> N >> K;
  vector<Int> A(N);
  cin >> A;

  vector<T> B(20, 0);
  vector<T> X(20, 0);

  for (Int i = 0; i < N; i++)
    X[A[i]] += 1;

  mint num = calc(A);
  mint ans = mint(K) * num;
  mint cost = 0;
  while (K) {
    if (K & 1) {
      auto p = calc(B, X);
      // auto p2 = calc(X, B);
      B = p.first;
      ans += p.second;
      ans += cost;
      // cost = 0;
    }
    auto p = calc(X, X);
    X = p.first;
    cost = cost + cost + p.second;
    K /= 2;
  }

  cout << ans << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, NAME, ...) NAME
#define pr(...)                                                                \
  cerr << GET_MACRO(__VA_ARGS__, pr8, pr7, pr6, pr5, pr4, pr3, pr2,            \
                    pr1)(__VA_ARGS__)                                          \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define prArr(a)                                                               \
  {                                                                            \
    cerr << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      cerr << (i++ ? ", " : "") << t;                                          \
    cerr << "}" << endl;                                                       \
  }
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}

template <typename T, T MOD = 1000000007> struct Mint {
  static constexpr T mod = MOD;
  T v;
  Mint() : v(0) {}
  Mint(signed v) : v(v) {}
  Mint(long long t) {
    v = t % MOD;
    if (v < 0)
      v += MOD;
  }

  Mint pow(long long k) {
    Mint res(1), tmp(v);
    while (k) {
      if (k & 1)
        res *= tmp;
      tmp *= tmp;
      k >>= 1;
    }
    return res;
  }

  static Mint add_identity() { return Mint(0); }
  static Mint mul_identity() { return Mint(1); }

  Mint inv() { return pow(MOD - 2); }

  Mint &operator+=(Mint a) {
    v += a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator-=(Mint a) {
    v += MOD - a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator*=(Mint a) {
    v = 1LL * v * a.v % MOD;
    return *this;
  }
  Mint &operator/=(Mint a) { return (*this) *= a.inv(); }

  Mint operator+(Mint a) const { return Mint(v) += a; };
  Mint operator-(Mint a) const { return Mint(v) -= a; };
  Mint operator*(Mint a) const { return Mint(v) *= a; };
  Mint operator/(Mint a) const { return Mint(v) /= a; };

  Mint operator-() const { return v ? Mint(MOD - v) : Mint(v); }

  bool operator==(const Mint a) const { return v == a.v; }
  bool operator!=(const Mint a) const { return v != a.v; }
  bool operator<(const Mint a) const { return v < a.v; }

  // find x s.t. a^x = b
  static T log(T a, T b) {
    const T sq = 40000;
    unordered_map<T, T> dp;
    dp.reserve(sq);
    Mint res(1);
    for (Int r = 0; r < sq; r++) {
      if (!dp.count(res.v))
        dp[res.v] = r;
      res *= a;
    }
    Mint p = Mint(a).inv().pow(sq);
    res = b;
    for (Int q = 0; q <= MOD / sq + 1; q++) {
      if (dp.count(res.v)) {
        T idx = q * sq + dp[res.v];
        if (idx > 0)
          return idx;
      }
      res *= p;
    }
    assert(0);
    return T(-1);
  }

  static Mint comb(long long n, Int k) {
    Mint num(1), dom(1);
    for (Int i = 0; i < k; i++) {
      num *= Mint(n - i);
      dom *= Mint(i + 1);
    }
    return num / dom;
  }
};
template <typename T, T MOD> constexpr T Mint<T, MOD>::mod;
template <typename T, T MOD> ostream &operator<<(ostream &os, Mint<T, MOD> m) {
  os << m.v;
  return os;
}

// INSERT ABOVE HERE

using mint = Mint<Int, mod>;

template <typename T> class CumulativeSum {
public:
  Int n;
  vector<T> sum;
  vector<T> A;
  Int added;
  CumulativeSum() : n(-1), added(0) {}
  CumulativeSum(Int n) : n(n), sum(n + 1), A(n + 1), added(0) {}
  CumulativeSum(const vector<T> &B)
      : n(B.size()), sum(n + 1), A(n + 1), added(0) {
    for (Int i = 1; i <= n; i++)
      sum[i] = sum[i - 1] + B[i - 1];
  }

  void apply() {
    for (Int i = 1; i <= n; i++)
      A[i] = A[i] + A[i - 1];
    for (Int i = 1; i <= n; i++)
      A[i] = A[i] + A[i - 1];
    for (Int i = 1; i <= n; i++)
      sum[i] = sum[i] + A[i - 1];
    added = 0;
    A.clear();
    A.resize(n + 1);
  }

  //[l, r)にxを加算
  void add(Int l, Int r, T x) {
    added = 1;
    assert(l <= r && 0 <= l && r <= n);
    A[l] = A[l] + x;
    A[r] = A[r] - x;
  }

  //[l, r)の和を得る
  T get(Int l, Int r) {
    assert(l <= r && 0 <= l && r <= n);
    if (added)
      apply();
    return sum[r] - sum[l];
  }
};

Int calc(vector<Int> A) {
  Int N = A.size();
  Int cnt = 0;
  for (Int i = 0; i < N; i++)
    for (Int j = i + 1; j < N; j++)
      if (A[i] > A[j])
        cnt++;
  return cnt;
}

using T = mint;
pair<vector<T>, mint> calc(vector<T> A, vector<T> B) {

  CumulativeSum<T> sumA(A);
  CumulativeSum<T> sumB(B);
  vector<T> res(A.size());

  const Int N = A.size();
  mint cost = 0;
  for (Int i = 0; i < (Int)A.size(); i++) {
    if (B[i] == 0)
      continue;
    res[i] = A[i] + B[i];
    cost += mint(sumA.get(i + 1, N)) * mint(B[i]);
  }
  return {res, cost};
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int N, K;
  cin >> N >> K;
  vector<Int> A(N);
  cin >> A;

  vector<T> B(2001, 0);
  vector<T> X(2001, 0);

  for (Int i = 0; i < N; i++)
    X[A[i]] += 1;

  mint num = calc(A);
  mint ans = mint(K) * num;
  mint cost = 0;
  while (K) {
    if (K & 1) {
      auto p = calc(B, X);
      // auto p2 = calc(X, B);
      B = p.first;
      ans += p.second;
      ans += cost;
      // cost = 0;
    }
    auto p = calc(X, X);
    X = p.first;
    cost = cost + cost + p.second;
    K /= 2;
  }

  cout << ans << endl;

  return 0;
}