fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9.  
  10. const int MAXN = 500005;
  11. ll w[MAXN], v[MAXN], f[MAXN];
  12. int L[MAXN], R[MAXN], st[MAXN];
  13. int n, top;
  14. ll solve(int u) {
  15. if (!u) return 0;
  16.  
  17. ll sumL = solve(L[u]);
  18. ll sumR = solve(R[u]);
  19. ll option1 = sumL + sumR;
  20.  
  21. f[u] = v[u] + max(f[L[u]], f[R[u]]);
  22.  
  23. return max(option1, f[u]);
  24. }
  25.  
  26. int main() {
  27. ios_base::sync_with_stdio(false);
  28. cin.tie(NULL);
  29.  
  30. if (!(cin >> n)) return 0;
  31.  
  32. for (int i = 1; i <= n; i++) cin >> w[i];
  33. for (int i = 1; i <= n; i++) cin >> v[i];
  34. top = 0;
  35. for (int i = 1; i <= n; i++) {
  36. int last = 0;
  37. while (top > 0 && w[st[top]] > w[i]) {
  38. last = st[top--];
  39. }
  40. if (top > 0) R[st[top]] = i;
  41. L[i] = last;
  42. st[++top] = i;
  43. }
  44.  
  45. cout << solve(st[1]) << endl;
  46.  
  47. return 0;
  48. }
  49.  
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
Standard output is empty