Problem p03176 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define ll long long
vector<ll> height, dp, b;
vector<ll> tree;
// buildtree(int *arr,start,end,node){

// }
// void treeupdate(int indx,int s,int  e,int updi,int upd ){
//     if(s==e) {
//         tree[indx]=upd;

//     }
//     else{
//         int mid=(s+e)/2;
//         int le=2*indx,ri=2*indx+1;
//         if(updi<=mid) treeupdate(le,0,mid,updi,upd);
//         else treeupdate(ri,mid+1,e,updi,upd);
//         tree[indx]=max(tree[le],tree[ri]);
//     }
// }
void treeupdate(int idx, int L, int R, int ii, ll upd) {
  if (L == R) {
    tree[idx] = upd;
    return;
  }
  int le = 2 * idx + 1, ri = le + 1, mid = (L + R) / 2;
  if (ii <= mid)
    treeupdate(le, L, mid, ii, upd);
  else
    treeupdate(ri, mid + 1, R, ii, upd);
  //
  tree[idx] = max(tree[le], tree[ri]);
}
// int treemax(int ind,int l,int r,int ql,int qr){
//     if(ql>r||qr<l) return 0;
//     if(ql<=l&&qr>=r) return tree[ind];
//     else{
//         int mid=(l+r)/2;
//         return
//         max(treemax(2*ind,l,mid,ql,qr),treemax(2*ind+1,mid+1,r,ql,qr));
//     }
// }
ll treemax(int idx, int L, int R, int QL, int QR) {
  if (L >= QL && R <= QR) {
    return tree[idx];
  }
  if (L > QR || R < QL)
    return 0;
  int le = 2 * idx + 1, ri = le + 1, mid = (L + R) / 2;
  ll a1 = treemax(le, L, mid, QL, QR);
  ll a2 = treemax(ri, mid + 1, R, QL, QR);
  //
  return max(a1, a2);
}
long long findbase(long long k) {
  long long ans = 0;

  while (k) {
    k = k >> 1;
    ans++;
  }
  return ans;
}
int main() {
  ll n;
  cin >> n;
  height.resize(n);
  dp.resize(n);
  b.resize(n);
  // cout<<findbase(n);
  tree.resize(1 << (findbase(n) + 1));
  // tree.resize(100);
  for (int i = 0; i < n; i++) {
    cin >> height[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> b[i];
    // dp[i]=b[i];
  }
  for (int i = 0; i < n; i++) {
    dp[i] = treemax(1, 1, n, 1, height[i] - 1) + b[i];
    treeupdate(1, 1, n, height[i], dp[i]);
    // cout<<dp[i]<<"X";
  }
  ll ans = 0;
  for (int i = 0; i < dp.size(); i++) {
    //   cout<<tree[i];
    ans = max(ans, dp[i]);
  }
  cout << ans;

  // cout<<treemax(0);
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define ll long long
vector<ll> height, dp, b;
vector<ll> tree;
// buildtree(int *arr,start,end,node){

// }
// void treeupdate(int indx,int s,int  e,int updi,int upd ){
//     if(s==e) {
//         tree[indx]=upd;

//     }
//     else{
//         int mid=(s+e)/2;
//         int le=2*indx,ri=2*indx+1;
//         if(updi<=mid) treeupdate(le,0,mid,updi,upd);
//         else treeupdate(ri,mid+1,e,updi,upd);
//         tree[indx]=max(tree[le],tree[ri]);
//     }
// }
void treeupdate(int idx, int L, int R, int ii, ll upd) {
  if (L == R) {
    tree[idx] = upd;
    return;
  }
  int le = 2 * idx + 1, ri = le + 1, mid = (L + R) / 2;
  if (ii <= mid)
    treeupdate(le, L, mid, ii, upd);
  else
    treeupdate(ri, mid + 1, R, ii, upd);
  //
  tree[idx] = max(tree[le], tree[ri]);
}
// int treemax(int ind,int l,int r,int ql,int qr){
//     if(ql>r||qr<l) return 0;
//     if(ql<=l&&qr>=r) return tree[ind];
//     else{
//         int mid=(l+r)/2;
//         return
//         max(treemax(2*ind,l,mid,ql,qr),treemax(2*ind+1,mid+1,r,ql,qr));
//     }
// }
ll treemax(int idx, int L, int R, int QL, int QR) {
  if (L >= QL && R <= QR) {
    return tree[idx];
  }
  if (L > QR || R < QL)
    return 0;
  int le = 2 * idx + 1, ri = le + 1, mid = (L + R) / 2;
  ll a1 = treemax(le, L, mid, QL, QR);
  ll a2 = treemax(ri, mid + 1, R, QL, QR);
  //
  return max(a1, a2);
}
long long findbase(long long k) {
  long long ans = 0;

  while (k) {
    k = k >> 1;
    ans++;
  }
  return ans;
}
int main() {
  ll n;
  cin >> n;
  height.resize(n);
  dp.resize(n);
  b.resize(n);
  // cout<<findbase(n);
  tree.resize(int(2e5 + 2) << 2);
  // tree.resize(100);
  for (int i = 0; i < n; i++) {
    cin >> height[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> b[i];
    // dp[i]=b[i];
  }
  for (int i = 0; i < n; i++) {
    dp[i] = treemax(1, 1, n, 1, height[i] - 1) + b[i];
    treeupdate(1, 1, n, height[i], dp[i]);
    // cout<<dp[i]<<"X";
  }
  ll ans = 0;
  for (int i = 0; i < dp.size(); i++) {
    //   cout<<tree[i];
    ans = max(ans, dp[i]);
  }
  cout << ans;

  // cout<<treemax(0);
  return 0;
}