Problem p03176 (C++)

Buggy submission (status: Time Limit Exceeded):
/*Saurav Paul*/
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long int
#define loop(i, a, b) for (ll i = a; i <= b; ++i)
#define boost ios_base::sync_with_stdio(0);
#define eb emplace_back
#define mp make_pair
#define clr(x) x.clear()
#define MOD 1e9 + 7
#define itoc(c) ((char)(((int)'0') + c))
#define ctoi(c) ((int)(((int)c) - '0'))
#define all(p) p.begin(), p.end()
#define iscn(num) scanf("%d", &num);
#define scn(num) scanf("%lld", &num);
#define scn2(num, num2) scanf("%lld%lld", &num, &num2);
using namespace std;
///////////////////////

#define sim template <class c
#define ris return *this
#define dor > debug &operator<<
#define eni(x)                                                                 \
  sim > typename enable_if<sizeof dud<c>(0) x 1, debug &>::type operator<<(    \
            c i) {
sim > struct rge {
  c b, e;
};
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c *x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef PAUL
  ~debug() { cerr << endl; }
  eni(!=) cerr << boolalpha << i;
  ris;
} eni(==) ris << range(begin(i), end(i));
}
sim, class b dor(pair<b, c> d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
  sim dor(const c &) { ris; }
#endif
}
;
#define dbg(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
////////////////////////

template <typename T> T set_bit(T N, T pos) { return N = N | (1 << pos); }
template <typename T> T reset_bit(T N, T pos) { return N = N & ~(1 << pos); }
template <typename T> bool check_bit(T N, T pos) {
  return (bool)(N & (1 << pos));
}
template <typename T> void bin_print(T N) {
  bitset<25> bit(N);
  cerr << bit.to_string() << "\n";
}
template <typename T> void max_self(T &a, T b) { a = max(a, b); }
template <typename T> void min_self(T &a, T b) { a = min(a, b); }
template <typename T> void add_self(T &a, T b) { a += b; }
////////////////////////

const ll INF = 2e18 + 99;
typedef pair<ll, ll> Pair;
typedef vector<ll> vec;
;

template <typename T> void ara_read(T &v, ll n) {
  ll temp;
  for (ll i = 0; i < n; i++) {
    scanf("%lld", &temp);
    v.emplace_back(temp);
  }
}
template <typename T> void ara_print(T &v) {
  for (ll x : v)
    printf("%lld ", x);
  puts("");
}
////////////////////////

int main() {
  int n;
  scanf("%d", &n);
  vector<int> heights, beauties;
  ara_read(heights, n);
  ara_read(beauties, n);
  // segment tree.....
  int base = 1;
  while (base <= n) {
    base <<= 1;
  }

  //~ cout << base << endl;
  // creating tree....
  vector<ll> tree(2 * base);

  vector<ll> dp(n + 1);
  for (int flower = 0; flower < n; flower++) {

    ll m = heights[flower] + base;
    ll best = 0;
    while (m >= 1) {
      if (m & 1) {
        max_self(best, tree[m - 1]);
      }
      m /= 2;
    }
    dp[heights[flower]] = best + beauties[flower];
    for (m = heights[flower] + base; m >= 1; m /= 2) {
      max_self(tree[m], dp[heights[flower]]);
    }

    for (int x = 0; x < heights[flower]; x++) {
      max_self(dp[heights[flower]], dp[x] + beauties[flower]);
    }
  }

  ll answer = 0;
  for (auto x : dp)
    max_self(answer, x);

  printf("%lld\n", answer);
  return 0;
}


Fixed submission:
/*Saurav Paul*/
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long int
#define loop(i, a, b) for (ll i = a; i <= b; ++i)
#define boost ios_base::sync_with_stdio(0);
#define eb emplace_back
#define mp make_pair
#define clr(x) x.clear()
#define MOD 1e9 + 7
#define itoc(c) ((char)(((int)'0') + c))
#define ctoi(c) ((int)(((int)c) - '0'))
#define all(p) p.begin(), p.end()
#define iscn(num) scanf("%d", &num);
#define scn(num) scanf("%lld", &num);
#define scn2(num, num2) scanf("%lld%lld", &num, &num2);
using namespace std;
///////////////////////

#define sim template <class c
#define ris return *this
#define dor > debug &operator<<
#define eni(x)                                                                 \
  sim > typename enable_if<sizeof dud<c>(0) x 1, debug &>::type operator<<(    \
            c i) {
sim > struct rge {
  c b, e;
};
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c *x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef PAUL
  ~debug() { cerr << endl; }
  eni(!=) cerr << boolalpha << i;
  ris;
} eni(==) ris << range(begin(i), end(i));
}
sim, class b dor(pair<b, c> d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
  sim dor(const c &) { ris; }
#endif
}
;
#define dbg(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
////////////////////////

template <typename T> T set_bit(T N, T pos) { return N = N | (1 << pos); }
template <typename T> T reset_bit(T N, T pos) { return N = N & ~(1 << pos); }
template <typename T> bool check_bit(T N, T pos) {
  return (bool)(N & (1 << pos));
}
template <typename T> void bin_print(T N) {
  bitset<25> bit(N);
  cerr << bit.to_string() << "\n";
}
template <typename T> void max_self(T &a, T b) { a = max(a, b); }
template <typename T> void min_self(T &a, T b) { a = min(a, b); }
template <typename T> void add_self(T &a, T b) { a += b; }
////////////////////////

const ll INF = 2e18 + 99;
typedef pair<ll, ll> Pair;
typedef vector<ll> vec;
;

template <typename T> void ara_read(T &v, ll n) {
  ll temp;
  for (ll i = 0; i < n; i++) {
    scanf("%lld", &temp);
    v.emplace_back(temp);
  }
}
template <typename T> void ara_print(T &v) {
  for (ll x : v)
    printf("%lld ", x);
  puts("");
}
////////////////////////

int main() {
  int n;
  scanf("%d", &n);
  vector<int> heights, beauties;
  ara_read(heights, n);
  ara_read(beauties, n);
  // segment tree.....
  int base = 1;
  while (base <= n) {
    base <<= 1;
  }

  //~ cout << base << endl;
  // creating tree....
  vector<ll> tree(2 * base);

  vector<ll> dp(n + 1);
  for (int flower = 0; flower < n; flower++) {

    ll m = heights[flower] + base;
    ll best = 0;
    while (m >= 1) {
      if (m & 1) {
        max_self(best, tree[m - 1]);
      }
      m /= 2;
    }
    dp[heights[flower]] = best + beauties[flower];
    for (m = heights[flower] + base; m >= 1; m /= 2) {
      max_self(tree[m], dp[heights[flower]]);
    }

    //~ for(int x = 0 ; x< heights[flower] ; x++){
    //~ max_self(dp[heights[flower]] , dp[x] + beauties[flower]);
    //~ }
  }

  ll answer = 0;
  for (auto x : dp)
    max_self(answer, x);

  printf("%lld\n", answer);
  return 0;
}