#include using namespace std; #define pb push_back #define mp make_pair #define fi first #define se second #define INF (1LL << 55) #define MOD (1000 * 1000 * 1000 + 7) #define maxn 200111 typedef long long ll; typedef long double ld; typedef pair pii; ll h, t; ll arr[maxn]; vector> robbers; map, ll> dp[20]; ll f(ll i, vector v){ if(t - i < v.size()){ return -INF; } if(v.size() == 0){ return 0; } if(i == t){ return -INF; } if(dp[i].count(v)){ return dp[i][v]; } ll val = f(i + 1, v); for(ll j = 0; j < v.size(); j++){ if(v[j] >= robbers[i].fi){ vector v_new = v; v_new[j] -= robbers[i].fi; if(v_new[j] == 0){ v_new.erase(v_new.begin() + j); } sort(v_new.begin(), v_new.end()); for(ll x : v_new){ assert(x > 0); } val = max(val, robbers[i].se + f(i + 1, v_new)); } } dp[i][v] = val; return val; } int main(){ vector v; scanf("%lld%lld", &h, &t); for(ll j = 0; j < h; j++){ ll k; scanf("%lld", &k); if(k > t){ printf("0\n"); return 0; } for(ll i = k + 1; i < 100; i++){ if(arr[i] > 0){ v.pb(arr[i]); arr[i] = 0; } } for(ll i = 1; i <= k; i++){ arr[i]++; } } for(ll i = 1; i < 100; i++){ if(arr[i] > 0){ v.pb(arr[i]); } } sort(v.begin(), v.end()); ll sum_robbers = 0; for(ll i = 0; i < t; i++){ ll d, c; scanf("%lld%lld", &d, &c); robbers.pb(mp(d, c)); sum_robbers += d; } sort(robbers.begin(), robbers.end()); reverse(robbers.begin(), robbers.end()); ll sum_clear = 0; for(ll x : v){ sum_clear += x; } if(v.size() > t || sum_clear > sum_robbers){ printf("0\n"); return 0; } printf("%lld\n", f(0, v)); return 0; }