#include <bits/stdc++.h>
using namespace std;
vector <int> a[300005];
int n,m,k[300005];
bool vis[300005];
bool check(const int maxd){
//for (int i = 1; i <= maxd; i++) cnt[i] = 0;
int need_day = 0;
for (int i = 1; i <= n; i++) vis[i] = 0;
for (int i = 1; i <= n; i++) {
int maxd_i = 0;
for (int j = 0; j < a[i].size(); j++)
if (a[i][j] > maxd_i && a[i][j] <= maxd) maxd_i = a[i][j];//找到<=maxd的最大的一天
int now = maxd_i;
int cnt = 0;
while (now && cnt < k[i]){
if (!vis[now]) cnt++,vis[now]=1;
now--;
}
need_day += (k[i]-cnt)*2 + cnt;
}
//cout << need << " " << maxd << " " << bool (need <= maxd) << "\n";
return need_day <= maxd;
}
int main(){
int sum_k=0;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> k[i],sum_k += k[i];
for (int i = 1; i <= m; i++) {
int d,t;
cin >> d >> t;
a[t].push_back(d);
}
int l = sum_k, r = sum_k*2, mid;
while (l <= r){
mid = (l+r) / 2;
if (check(mid)) r = mid-1;
else l = mid+1;
//cout << l << " " << r << "\n";
}
cout << l;
}
check中心是从当前天往前找在这之前赚到没有花出去的最多的钱,贪心的想法
但是WA on 18