#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, nn, tmp, sum = 0;
  cin >> n;
  vector<pair<int, int>> vec_vt(n);
  vector<vector<int>> g(n);
  vector<bool> vec_sign(n, false);
  nn = n;
  while (nn--) {
    cin >> tmp;
    sum += tmp;
    vec_vt[n - nn - 1] = make_pair(n - nn - 1, tmp);
  }
  if (sum < 2 * n - 2) {
    cout << "NO" << endl;
    return 0;
  }
  sort(vec_vt.begin(), vec_vt.end(),
       [](pair<int, int>& lsv, pair<int, int>& rsv) {
         return lsv.second < rsv.second;
       });
  int head = 0;
  int tail = 1;
  int edge_cnt = 0;
  int diam = 0;
  vec_sign[head] = true;
  vec_sign[tail] = true;
  for (int cnt = 2; cnt < n; ++cnt) {
    if (vec_vt[cnt].second > 1) {
      --vec_vt[head].second;
      --vec_vt[cnt].second;
      g[vec_vt[head].first].push_back(vec_vt[cnt].first);
      ++edge_cnt;
      ++diam;
      head = cnt;
      vec_sign[cnt] = true;
    }
  }
  --vec_vt[head].second;
  --vec_vt[tail].second;
  g[vec_vt[head].first].push_back(vec_vt[tail].first);
  ++edge_cnt;
  ++diam;
  for (int cnt = 2; cnt < n; ++cnt) {
    if (!vec_sign[cnt]) {
      for (int i = n - 1; i >= 0; --i) {
        if (vec_sign[i] && vec_vt[i].second > 0) {
          vec_sign[cnt] = true;
          --vec_vt[i].second;
          --vec_vt[cnt].second;
          g[vec_vt[i].first].push_back(vec_vt[cnt].first);
          ++edge_cnt;
          break;
        }
      }
    }
  }
  cout << "YES " << diam << endl;
  cout << edge_cnt << endl;
  for (int i = 0; i < n; ++i)
    for (auto ele : g[i]) cout << i + 1 << " " << ele + 1 << endl;
}
