inline void pushup(int x) { data a = tr[x<<1], b = tr[x<<1|1], &c = tr[x]; c.max = std::max(a.max, b.max), c.max2 = -1, c.num = 0; if(a.max == c.max) { c.num += a.num; chkmax(c.max2, a.max2); } else chkmax(c.max2, a.max); if(b.max == c.max) { c.num += b.num; chkmax(c.max2, b.max2); } else chkmax(c.max2, b.max); c.sum = a.sum+b.sum; }
LL solve() { int n; getint2(m, n); ans = 0; for(int i = 0; i < n; i++) { getint2(k[i], l[i]); k[i] = k[i] - l[i] + 1; for (int j = 0; j < l[i] - 1; j++) { int x; getint(x); } for (int j = 0; j < k[i]; j++) { getint(a[i][j]); } for (int j = 0; j < l[i] - 1; j++) { int x; getint(x); } for (int j = 0; j < k[i] - 1; j++) { getint(c[i][j]); } } for (int i = 0; i < (1 << n); i++) { if (__builtin_popcount(i) != 8) continue; int s = i; vector<int> l, r; for (int j = 0; j < n; j++) { if (s & 1) { if (l.size() != 4) l.pb(j); else r.pb(j); } s >>= 1; } solve(l, lans); solve(r, rans); if (rans.empty()) continue; for (map<int, LL>::iterator it = lans.begin(); it != lans.end(); it++) { if (m - it->c0 < 0) break; map<int, LL>::iterator rit = rans.upper_bound(m - it->c0); if (rit == rans.begin()) break; rit--; chkmax(ans, it->c1 + rit->c1); } } return ans; }