#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fll;
struct dinic {
  const bool scaling = false;
  int lim;
  struct edge {
    int to, cap, rev, flow;
    bool res;
    edge(int to_, int cap_, int rev_, bool res_)
        : to(to_), cap(cap_), rev(rev_), flow(0), res(res_) {}
  };
  vector<vector<edge>> g;
  vector<int> lev, beg;
  dinic(int n) : g(n) {}
  void add(int a, int b, int c) {
    g[a].push_back(edge(b, c, g[b].size(), false));
    g[b].push_back(edge(a, 0, g[a].size() - 1, true));
  }
  bool bfs(int second, int t) {
    lev = vector<int>(g.size(), -1);
    lev[second] = 0;
    beg = vector<int>(g.size(), 0);
    queue<int> q;
    q.push(second);
    while (q.size()) {
      int u = q.front();
      q.pop();
      for (auto& i : g[u]) {
        if (lev[i.to] != -1 or (i.flow == i.cap)) continue;
        if (scaling and i.cap - i.flow < lim) continue;
        lev[i.to] = lev[u] + 1;
        q.push(i.to);
      }
    }
    return lev[t] != -1;
  }
  int dfs(int v, int second, int first = INF) {
    if (!first or v == second) return first;
    for (int& i = beg[v]; i < g[v].size(); i++) {
      auto& e = g[v][i];
      if (lev[e.to] != lev[v] + 1) continue;
      int foi = dfs(e.to, second, min(first, e.cap - e.flow));
      if (!foi) continue;
      e.flow += foi, g[e.to][e.rev].flow -= foi;
      return foi;
    }
    return 0;
  }
  long long max_flow(int second, int t) {
    long long first = 0;
    for (lim = scaling ? (1 << 30) : 1; lim; lim /= 2)
      while (bfs(second, t))
        while (int ff = dfs(second, t)) first += ff;
    return first;
  }
};
const int MAX = 1e3 + 10;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> v(n);
  for (int& i : v) cin >> i;
  int second = 0;
  for (int i : v) second += i;
  dinic g(MAX + n + 2);
  for (int i = 0; i < MAX - 1; i++) g.add(i, i + 1, INF);
  for (int i = 1; i < MAX; i++) g.add(MAX + n, i, 1);
  for (int i = 0; i < n; i++) g.add(MAX + i, MAX + n + 1, v[i]);
  vector<pair<int, int>> w;
  while (m--) {
    int a, b;
    cin >> a >> b;
    w.push_back({a, b});
  }
  int l = 1, r = 2 * MAX;
  int best = INF;
  while (l < r) {
    int M = (l + r) / 2;
    dinic g2 = g;
    for (auto i : w)
      if (i.first <= M) g2.add(i.first, MAX + i.second - 1, INF);
    int first = g2.max_flow(MAX + n, MAX + n + 1);
    if (first + (second - first) * 2 <= M) {
      best = min(best, M);
      r = M;
    } else
      l = M + 1;
  }
  cout << best << '\n';
  exit(0);
}
