#include <bits/stdc++.h>
using namespace std;
const int MAXN = (int)5e2 + 228;
const char nxtl = '\n';
const int mod = (int)1e9 + 7;
const double eps = (double)1e-7;
template <typename T>
inline bool updmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool updmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
int n;
set<int> g[MAXN];
inline pair<int, int> bfs(int s) {
  bool used[n + 5];
  memset(used, 0, sizeof used);
  used[s] = 1;
  queue<int> q;
  q.push(s);
  int d[n + 5];
  memset(d, 0, sizeof d);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (auto &to : g[v]) {
      if (used[to]) continue;
      q.push(to);
      d[to] = d[v] + 1;
      used[to] = 1;
    }
  }
  int mx = 0, cur = 0;
  for (int i = 1; i <= n; ++i)
    if (updmax(mx, d[i])) cur = i;
  return {cur, mx};
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  unsigned int FOR;
  asm("rdtsc" : "=A"(FOR));
  srand(FOR);
  cin >> n;
  int a[n + 5];
  memset(a, 0, sizeof a);
  vector<int> v1, v2;
  int ALL = 0;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    if (a[i] > 1)
      v1.push_back(i);
    else
      v2.push_back(i);
    ALL += a[i];
  }
  if (ALL < (n << 1) - 2) return cout << "NO", 0;
  int EDGES = 0;
  for (int i = 0; i <= ((int)(v1.size())) - 2; ++i) {
    ++EDGES;
    g[v1[i]].insert(v1[i + 1]);
    g[v1[i + 1]].insert(v1[i]);
    --a[v1[i]];
    --a[v1[i + 1]];
  }
  if (!v2.empty() && a[v1.back()]--) {
    ++EDGES;
    g[v1.back()].insert(v2.back());
    g[v2.back()].insert(v1.back());
    v2.pop_back();
  }
  for (int i = 0; i <= ((int)(v1.size())) - 1; ++i)
    while (!v2.empty() && a[v1[i]]--) {
      ++EDGES;
      g[v1[i]].insert(v2.back());
      g[v2.back()].insert(v1[i]);
      v2.pop_back();
    }
  cout << "YES " << bfs(bfs(1).first).second << nxtl;
  cout << EDGES << nxtl;
  for (int i = 1; i <= n; ++i)
    while (!g[i].empty()) {
      auto &to = *g[i].begin();
      cout << i << " " << to << nxtl;
      g[to].erase(i);
      g[i].erase(to);
    }
  return 0;
}
