Problem p03176 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
template <typename X> ostream &operator<<(ostream &x, const vector<X> &v) {
  for (ll i = 0; i < v.size(); ++i)
    x << v[i] << " ";
  return x;
}
template <typename X> ostream &operator<<(ostream &x, const set<X> &v) {
  for (auto it : v)
    x << it << " ";
  return x;
}
template <typename X, typename Y>
ostream &operator<<(ostream &x, const pair<X, Y> &v) {
  x << v.ff << " " << v.ss;
  return x;
}
template <typename T, typename S>
ostream &operator<<(ostream &os, const map<T, S> &v) {
  for (auto it : v)
    os << it.first << "=>" << it.second << endl;
  return os;
}
struct pair_hash {
  inline std::size_t operator()(const std::pair<ll, ll> &v) const {
    return v.first * 31 + v.second;
  }
};
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define speed                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL)
#define pb push_back
#define fr first
#define sc second
#define prnt(m)                                                                \
  for (auto it = m.begin(); it != m.end(); ++it) {                             \
    cout << *it << endl;                                                       \
  }
#define tra(it, m) for (auto it = m.begin(); it != m.end(); ++it)
#define DBG(x) cout << "# # #     " << x << '\n';
#define fri(i, s, n) for (long long i = s; i < n; i++)
#define mod 1000000007LL
#define mod2 998244353
#define vct2 vector<vector<ll>>
#define vct vector<ll>
#define pll pair<ll, ll>
#define rz(n) resize(n)
#define all(v) v.begin(), v.end()
#define mkp make_pair
#define arrin(a, n)                                                            \
  for (ll i = 0; i < n; i++) {                                                 \
    cin >> a[i];                                                               \
  }
#define arrout(a, n)                                                           \
  for (ll i = 0; i < n; i++) {                                                 \
    cout << a[i] << " ";                                                       \
  }
#define ex(s) cout << s << endl, exit(0);
#define infy 2e18
#define five 100005;
#define six 1000005;
#define printclock                                                             \
  cerr << "Time : " << 1000 * (ld)clock() / (ld)CLOCKS_PER_SEC << "ms\n";
//___________________________________________________________________________________________________________________________________________________________
const int N = five;
ll seg[4 * N];
void update(int ind, int rl, int rr, int idx, ll val) {
  if (rl == rr) {
    seg[ind] = val;
    return;
  }
  int mid = (rl + rr) / 2;
  if (idx <= mid && idx >= rl) {
    update(2 * ind, rl, mid, idx, val);
  } else {
    update(2 * ind + 1, mid + 1, rr, idx, val);
  }
  seg[ind] = max(seg[2 * ind], seg[2 * ind + 1]);
}
ll q(int ind, int rl, int rr, int ql, int qr) {
  if (ql > rr || rl > qr) {
    return 0;
  }
  if (rl >= ql && rr <= qr) {
    return seg[ind];
  }
  int mid = (rl + rr) / 2;
  return max(q(2 * ind, rl, mid, ql, qr), q(2 * ind + 1, mid + 1, rr, ql, qr));
}
int main() {
  memset(seg, 0, sizeof seg);
  int n;
  cin >> n;
  ll h[n];
  ll a[n];
  arrin(h, n);
  arrin(a, n);
  fri(i, 0, n) { h[i]--; }
  ll ans[n];
  ll maxi = 0;
  fri(i, 0, n) {
    ll qq = q(1, 0, n - 1, 0, h[i]);
    ans[i] = qq + a[i];
    update(1, 0, n - 1, h[i], ans[i]);
    maxi = max(maxi, ans[i]);
  }
  cout << maxi << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
template <typename X> ostream &operator<<(ostream &x, const vector<X> &v) {
  for (ll i = 0; i < v.size(); ++i)
    x << v[i] << " ";
  return x;
}
template <typename X> ostream &operator<<(ostream &x, const set<X> &v) {
  for (auto it : v)
    x << it << " ";
  return x;
}
template <typename X, typename Y>
ostream &operator<<(ostream &x, const pair<X, Y> &v) {
  x << v.ff << " " << v.ss;
  return x;
}
template <typename T, typename S>
ostream &operator<<(ostream &os, const map<T, S> &v) {
  for (auto it : v)
    os << it.first << "=>" << it.second << endl;
  return os;
}
struct pair_hash {
  inline std::size_t operator()(const std::pair<ll, ll> &v) const {
    return v.first * 31 + v.second;
  }
};
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define speed                                                                  \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL)
#define pb push_back
#define fr first
#define sc second
#define prnt(m)                                                                \
  for (auto it = m.begin(); it != m.end(); ++it) {                             \
    cout << *it << endl;                                                       \
  }
#define tra(it, m) for (auto it = m.begin(); it != m.end(); ++it)
#define DBG(x) cout << "# # #     " << x << '\n';
#define fri(i, s, n) for (long long i = s; i < n; i++)
#define mod 1000000007LL
#define mod2 998244353
#define vct2 vector<vector<ll>>
#define vct vector<ll>
#define pll pair<ll, ll>
#define rz(n) resize(n)
#define all(v) v.begin(), v.end()
#define mkp make_pair
#define arrin(a, n)                                                            \
  for (ll i = 0; i < n; i++) {                                                 \
    cin >> a[i];                                                               \
  }
#define arrout(a, n)                                                           \
  for (ll i = 0; i < n; i++) {                                                 \
    cout << a[i] << " ";                                                       \
  }
#define ex(s) cout << s << endl, exit(0);
#define infy 2e18
#define five 100005;
#define six 1000005;
#define printclock                                                             \
  cerr << "Time : " << 1000 * (ld)clock() / (ld)CLOCKS_PER_SEC << "ms\n";
//___________________________________________________________________________________________________________________________________________________________
const int N = five;
ll seg[6 * N];
void update(int ind, int rl, int rr, int idx, ll val) {
  if (rl == rr) {
    seg[ind] = val;
    return;
  }
  int mid = (rl + rr) / 2;
  if (idx <= mid && idx >= rl) {
    update(2 * ind, rl, mid, idx, val);
  } else {
    update(2 * ind + 1, mid + 1, rr, idx, val);
  }
  seg[ind] = max(seg[2 * ind], seg[2 * ind + 1]);
}
ll q(int ind, int rl, int rr, int ql, int qr) {
  if (ql > rr || rl > qr) {
    return 0;
  }
  if (rl >= ql && rr <= qr) {
    return seg[ind];
  }
  int mid = (rl + rr) / 2;
  return max(q(2 * ind, rl, mid, ql, qr), q(2 * ind + 1, mid + 1, rr, ql, qr));
}
int main() {
  memset(seg, 0, sizeof seg);
  int n;
  cin >> n;
  ll h[n];
  ll a[n];
  arrin(h, n);
  arrin(a, n);
  fri(i, 0, n) { h[i]--; }
  ll ans[n];
  ll maxi = 0;
  fri(i, 0, n) {
    ll qq = q(1, 0, n - 1, 0, h[i]);
    ans[i] = qq + a[i];
    update(1, 0, n - 1, h[i], ans[i]);
    maxi = max(maxi, ans[i]);
  }
  cout << maxi << endl;
}