Problem p01545 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <complex>
#include <cstdio>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

// common

typedef int i32;
typedef long long i64, ll;
typedef long double ld;

#define BR "\\n"
#define ALL(c) (c).begin(), (c).end()
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define FOR(i, l, r) for (int i = (int)l; i < (int)(r); ++i)
#define EACH(it, o) for (auto it = (o).begin(); it != (o).end(); ++it)
#define IN(l, v, r) ((l) <= (v) && (v) < (r))

// config
// #define NDEBUG
// #define INF 1<<30
// #define EPS 1e-8
// const ll MOD =100000007;

// debug
#ifdef NDEBUG
#define DUMP(x)
#define DUMPLN(x)
#define DEBUG(x)
#define DEBUGLN(x)
#define LINE()
#define LINELN()
#define CHECK(exp, act)
#define STOP(e)
#else
#define DUMP(x) cerr << #x << " = " << (x)
#define DUMPLN(x) DUMP(x) << endl
#define DEBUG(x) DUMP(x) << LINE() << " " << __FILE__
#define DEBUGLN(x) DEBUG(x) << endl
#define LINE() cerr << " (L" << __LINE__ << ")"
#define LINELN() LINE() << endl
#define CHECK(exp, act)                                                        \\
  if (exp != act) {                                                            \\
    DUMPLN(exp);                                                               \\
    DEBUGLN(act);                                                              \\
  }
#define STOP(e)                                                                \\
  CHECK(e, true);                                                              \\
  if (!(e))                                                                    \\
    exit(1);
#endif

template <class T> inline string toString(const vector<T> &x) {
  stringstream ss;
  REP(i, x.size()) {
    if (i != 0)
      ss << " ";
    ss << x[i];
  }
  return ss.str();
}

template <class T> inline string toString(const vector<vector<T>> &map) {
  stringstream ss;
  REP(i, map.size()) {
    if (i != 0)
      ss << BR;
    ss << toString(map[i]);
  }
  return ss.str();
}
template <class K, class V> string toString(map<K, V> &x) {
  string res;
  stringstream ss;
  for (auto &p : x)
    ss << p.first << ":" << p.second << " ";
  return ss.str();
}

string BITtoString(int bit) {
  stringstream ss;
  while (bit != 0) {
    ss << (bit % 2);
    bit /= 2;
  }
  string res = ss.str();
  reverse(ALL(res));
  return res;
}

template <typename T, typename V> inline T pmod(T v, V MOD) {
  return (v % MOD + MOD) % MOD;
}
#define nextInt(n) scanf("%d", &n)
#define defInt(n)                                                              \\
  int n;                                                                       \\
  nextInt(n)
#define nextLong(n) scanf("%lld", &n)
#define defLong(n)                                                             \\
  ll n;                                                                        \\
  nextLong(n)
#define nextDouble(n) scanf("%lf", &n)

namespace SegmentTrees {
ll INF = 1LL << 58;

template <typename T> class RMQ {
private:
  int Pow2Fit(int n) {
    int d = 1;
    while ((d << 1) <= n)
      d <<= 1;
    return d;
  }

public:
  vector<T> dat;
  int n, size;
  RMQ(int _n) {
    n = Pow2Fit(_n) << 1;
    size = 2 * n - 1;
    dat = vector<T>(size, 0);
  }
  void set(int v, T a) {
    v += n - 1;
    dat[v] = a;
    while (v > 0) {
      int parent = v = (v - 1) / 2;
      int chl = parent * 2 + 1, chr = parent * 2 + 2;
      dat[parent] = max(dat[chl], dat[chr]);
    }
  }
  T get(int v) { // v
    return dat[v + n - 1];
  }
  T query(int a, int b) { //[a,b)
    return query(0, a, b, 0, n);
  }

private:
  T query(int v, int a, int b, int l, int r) { //[a,b)
    if (r <= a || b <= l)
      return 0; // out range
    if (a <= l && r <= b)
      return dat[v];

    T vl = query(v * 2 + 1, a, b, l, (l + r) / 2),
      vr = query(v * 2 + 2, a, b, (l + r) / 2, r);
    return max(vl, vr);
  }
};
} // namespace SegmentTrees
using namespace SegmentTrees;

class Main {
public:
  void run() {
    //	ifstream cin("in");
    //	ofstream cout( "out" );
    int N;
    nextInt(N);
    RMQ<ll> rmq(N);
    vector<int> as(N);
    REP(i, N) nextInt(as[i]), as[i];
    REP(i, N) { rmq.set(as[i] - 1, rmq.query(0, as[i]) + as[i]); }
    ll sum = 0;
    REP(i, N) sum += (i + 1);
    cout << sum - rmq.query(0, N) << endl;
  }
};
int main() {
  cout << fixed << setprecision(13);
  ios::sync_with_stdio(false);
  Main().run();
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <complex>
#include <cstdio>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

// common

typedef int i32;
typedef long long i64, ll;
typedef long double ld;

#define BR "\\n"
#define ALL(c) (c).begin(), (c).end()
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define FOR(i, l, r) for (int i = (int)l; i < (int)(r); ++i)
#define EACH(it, o) for (auto it = (o).begin(); it != (o).end(); ++it)
#define IN(l, v, r) ((l) <= (v) && (v) < (r))

// config
// #define NDEBUG
// #define INF 1<<30
// #define EPS 1e-8
// const ll MOD =100000007;

// debug
#ifdef NDEBUG
#define DUMP(x)
#define DUMPLN(x)
#define DEBUG(x)
#define DEBUGLN(x)
#define LINE()
#define LINELN()
#define CHECK(exp, act)
#define STOP(e)
#else
#define DUMP(x) cerr << #x << " = " << (x)
#define DUMPLN(x) DUMP(x) << endl
#define DEBUG(x) DUMP(x) << LINE() << " " << __FILE__
#define DEBUGLN(x) DEBUG(x) << endl
#define LINE() cerr << " (L" << __LINE__ << ")"
#define LINELN() LINE() << endl
#define CHECK(exp, act)                                                        \\
  if (exp != act) {                                                            \\
    DUMPLN(exp);                                                               \\
    DEBUGLN(act);                                                              \\
  }
#define STOP(e)                                                                \\
  CHECK(e, true);                                                              \\
  if (!(e))                                                                    \\
    exit(1);
#endif

template <class T> inline string toString(const vector<T> &x) {
  stringstream ss;
  REP(i, x.size()) {
    if (i != 0)
      ss << " ";
    ss << x[i];
  }
  return ss.str();
}

template <class T> inline string toString(const vector<vector<T>> &map) {
  stringstream ss;
  REP(i, map.size()) {
    if (i != 0)
      ss << BR;
    ss << toString(map[i]);
  }
  return ss.str();
}
template <class K, class V> string toString(map<K, V> &x) {
  string res;
  stringstream ss;
  for (auto &p : x)
    ss << p.first << ":" << p.second << " ";
  return ss.str();
}

string BITtoString(int bit) {
  stringstream ss;
  while (bit != 0) {
    ss << (bit % 2);
    bit /= 2;
  }
  string res = ss.str();
  reverse(ALL(res));
  return res;
}

template <typename T, typename V> inline T pmod(T v, V MOD) {
  return (v % MOD + MOD) % MOD;
}
#define nextInt(n) scanf("%d", &n)
#define defInt(n)                                                              \\
  int n;                                                                       \\
  nextInt(n)
#define nextLong(n) scanf("%lld", &n)
#define defLong(n)                                                             \\
  ll n;                                                                        \\
  nextLong(n)
#define nextDouble(n) scanf("%lf", &n)

namespace SegmentTrees {
ll INF = 1LL << 58;

template <typename T> class RMQ {
private:
  int Pow2Fit(int n) {
    int d = 1;
    while ((d << 1) <= n)
      d <<= 1;
    return d;
  }

public:
  vector<T> dat;
  int n, size;
  RMQ(int _n) {
    n = Pow2Fit(_n) << 1;
    size = 2 * n - 1;
    dat = vector<T>(size, 0);
  }
  void set(int v, T a) {
    v += n - 1;
    dat[v] = a;
    while (v > 0) {
      int parent = v = (v - 1) / 2;
      int chl = parent * 2 + 1, chr = parent * 2 + 2;
      dat[parent] = max(dat[chl], dat[chr]);
    }
  }
  T get(int v) { // v
    return dat[v + n - 1];
  }
  T query(int a, int b) { //[a,b)
    return query(0, a, b, 0, n);
  }

private:
  T query(int v, int a, int b, int l, int r) { //[a,b)
    if (r <= a || b <= l)
      return 0; // out range
    if (a <= l && r <= b)
      return dat[v];

    T vl = query(v * 2 + 1, a, b, l, (l + r) / 2),
      vr = query(v * 2 + 2, a, b, (l + r) / 2, r);
    return max(vl, vr);
  }
};
} // namespace SegmentTrees
using namespace SegmentTrees;

class Main {
public:
  void run() {
    //	ifstream cin("in");
    //	ofstream cout( "out" );
    while (true) {
      int N;
      nextInt(N);
      if (N == 0)
        break;
      RMQ<ll> rmq(N);
      vector<int> as(N);
      REP(i, N) nextInt(as[i]), as[i];
      REP(i, N) { rmq.set(as[i] - 1, rmq.query(0, as[i]) + as[i]); }
      ll sum = 0;
      REP(i, N) sum += (i + 1);
      cout << sum - rmq.query(0, N) << endl;
    }
  }
};
int main() {
  cout << fixed << setprecision(13);
  ios::sync_with_stdio(false);
  Main().run();
  return 0;
}