fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. //MasterChef
  4. const int MAX = 1e6+7;
  5.  
  6. int n,m,k;
  7. void update(int l,int r,int b,int e,int node,int val,vector<int> &tree){
  8. if(l==r){
  9. tree[node] = min(tree[node],val);
  10. }
  11.  
  12. if(b>r || e<r) return;
  13. int m = (l+r)/2;
  14. update(l,r,b,m,2*node+1,val,tree);
  15. update(l,r,m+1,r,2*node+2,val,tree);
  16. }
  17.  
  18. int query(int b,int e,int l,int r,int node,vector<int> &tree){
  19.  
  20. if(b>r || e<l) return INT_MAX;
  21. if(b>=l && e<=r) return tree[node];
  22. if(l==r) return tree[node];
  23. int m = (l+r)/2;
  24. return min(query(b,m,l,r,2*node+1,tree),query(m+1,e,l,r,2*node+2,tree));
  25. }
  26.  
  27. int solve(int k,int i,vector<vector<int> > &dp,vector<int> &a, vector<int> & tree){
  28.  
  29. if(dp[i][k]!=-1) return dp[i][k];
  30. if(k<0) return INT_MIN;
  31. if(i==n) return 0;
  32. int mn = 0;
  33. if(a[i]>=0) mn = a[i] + solve(i+1,k,dp,a,tree);
  34. else mn = max(a[i] + solve(i+1,k,dp,a,tree),solve(i+1,k - query(0,n-1,i,i,0,tree),dp,a,tree));
  35. dp[i][k] = mn;
  36. return mn;
  37. }
  38.  
  39.  
  40. int main(){
  41.  
  42. ios_base::sync_with_stdio(false);
  43. cin.tie(0); cout.tie(0);
  44.  
  45. int t; cin>>t;
  46. while(t-->0)
  47. {
  48. cin>>n>>k>>m;
  49. vector<int> tree(5*n,INT_MAX),a(n);
  50.  
  51. vector<vector<int> > dp(n,vector<int>(k,-1));
  52. for(int i=0;i<n;i++) cin>>a[i];
  53.  
  54. for(int i=1;i<=m;i++){
  55. int l,r,c;
  56. cin>>l>>r>>c;
  57. update(l,r,0,n-1,0,c,tree);
  58. }
  59.  
  60. cout<<solve(k,0,dp,a,tree)<<'\n';
  61. }
  62.  
  63. return 0;
  64. }
  65.  
Runtime error #stdin #stdout 0s 4288KB
stdin
1
5 10 5
10 -2 -5 7 -10
1 1 5
2 4 10
4 4 12
3 4 10
1 5 15
stdout
Standard output is empty