#include using namespace std; typedef long long int ll; typedef double ld; typedef vector vi; // push_back insert lower_bound upper_bound erase struct Liska{ ll length, score; }; struct S{ ll score, idx, val; }; int main(int argc, char **argv){ ll C, L; cin >> C >> L; vector columns(C);for(ll &n:columns)cin>>n; columns.push_back(0); vi rows, stack; ll last = 0; for(ll i=0; i<=C; ++i){ ll current = columns[i]; for(ll j=last; j L){ cout << 0 << endl; exit(0); } } for(ll j=current; j lisky(L);for(Liska &l:lisky)cin>>l.length>>l.score; sort(rows.rbegin(),rows.rend()); vector dp(1< rows[substate.idx]){ substate = {-1,0,0}; }else if(substate.val==rows[substate.idx]){ ++substate.idx; substate.val = 0; if(substate.idx == R){ best_score = max(best_score, substate.score); /* cerr << "new best score " << best_score << endl; */ } } if(best.score < substate.score) best = substate; } } dp[s] = best; /* cerr << "best for "<<(bitset<10>(s))<<" is "<