#include #include #include using namespace std; typedef long long ll; typedef pair P; typedef pair P1; typedef pair P2; #define pu push #define pb push_back #define mp make_pair #define eps 1e-7 #define INF 1000000000 #define mod 1000000007 #define fi first #define sc second #define rep(i,x) for(int i=0;i>V; vectormask[30]; ll ans; void solve(){ if(V.size() <= 10){ for(int k=0;k>i)&1)){ gen += V[i].fi; gain += V[i].sc; } } if(sum >= gen) ans = max(ans,gain); } cout << ans << endl; return ; } int nn = V.size()/2; int mm = V.size()-nn; vector>pr[2]; rep(k,mask[nn].size()){ ll genn = 0, gainn = 0; int f = 0; rep(i,nn){ int M = mask[nn][k]; if(((M>>i)&1)){ if(i == nn-1) f = 1; genn += V[i].fi; gainn += V[i].sc; } } pr[f].pb(mp(genn,gainn)); } rep(f,2) SORT(pr[f]); rep(f,2) for(int i=1;i>i)&1)){ if(i == 0) f = 1; genn += V[nn+i].fi; gainn += V[nn+i].sc; } } int pt = POSL(pr[0],mp(sum-genn+1,(ll)-1e18)); pt--; if(pt >= 0) ans = max(ans,pr[0][pt].sc+gainn); if(!f){ int pt = POSL(pr[1],mp(sum-genn+1,(ll)-1e18)); pt--; if(pt >= 0) ans = max(ans,pr[1][pt].sc+gainn); } } cout << ans << endl; } int main(){ mask[0].pb(0); mask[1].pb(0); mask[1].pb(1); for(int i=2;i<=26;i++){ for(int j=0;j= (1<<(i-2))){ continue; } else mask[i].pb(mask[i-1][j] | (1<<(i-1))); } SORT(mask[i]); ERASE(mask[i]); } scanf("%d",&n); repn(i,n) scanf("%lld%lld%lld",&a[i],&b[i],&c[i]); repn(i,n) sum += a[i]; for(int i=2;i<=n;i++){ ll N = a[i-1]+a[i]+c[i]; ll G = b[i]; V.pb(mp(N,G)); } solve(); }