#include <bits/stdc++.h>
using namespace std;
long long power(long long a, long long n) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
long long power(long long a, long long n, long long mod) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
      p %= mod;
    }
    n >>= 1;
    a *= a;
    a %= mod;
  }
  return p % mod;
}
long long modInverse(long long a, long long m) {
  long long m0 = m;
  long long y = 0, x = 1;
  if (m == 1) {
    return 0;
  }
  while (a > 1) {
    long long q = a / m;
    long long t = m;
    m = a % m, a = t;
    t = y;
    y = x - q * y;
    x = t;
  }
  if (x < 0) {
    x += m0;
  }
  return x;
}
inline long long add(long long a, long long b) {
  return (((a >= 1000000007) ? a % 1000000007 : a) +
          ((b >= 1000000007) ? b % 1000000007 : b) + 1000000007) %
         1000000007;
}
inline long long subt(long long a, long long b) {
  return (a - b + 1000000007) % 1000000007;
}
inline long long mult(long long a, long long b) {
  return (1ll * ((a >= 1000000007) ? a % 1000000007 : a) *
          ((b >= 1000000007) ? b % 1000000007 : b)) %
         1000000007;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
bool compare(const pair<long long, long long> &a,
             const pair<long long, long long> &b) {
  if (a.first == b.first) {
    return a.second < b.second;
  }
  return a.first < b.first;
}
bool comparerev(const pair<long long, long long> &a,
                const pair<long long, long long> &b) {
  if (a.first == b.first) {
    return a.second > b.second;
  }
  return a.first > b.first;
}
int main() {
  int n;
  cin >> n;
  int a[n];
  for (int i = 0; i < n; i++) cin >> a[i];
  vector<pair<int, int> > v;
  for (int i = 0; i < n; i++) {
    v.push_back({a[i], i});
  }
  sort(v.begin(), v.end());
  for (int i = n - 1; i >= 2; i--) {
    vector<pair<int, int> > lol = v;
    reverse(lol.begin(), lol.end());
    int left = i - 1;
    vector<int> corners;
    corners.push_back(lol.back().second);
    lol.pop_back();
    corners.push_back(lol.back().second);
    lol.pop_back();
    bool ok = true;
    vector<int> kek;
    vector<pair<int, int> > edges;
    for (int j = 0; j < left; j++) {
      if (lol[j].first < 2) {
        ok = false;
        break;
      }
      kek.push_back(lol[j].second);
    }
    if (!ok) continue;
    edges.push_back({corners[0], kek[0]});
    edges.push_back({corners[1], kek[left - 1]});
    for (int j = 1; j < left; j++) {
      edges.push_back({kek[j - 1], kek[j]});
    }
    vector<int> lmao;
    for (int j = left; j < lol.size(); j++) {
      lmao.push_back(lol[j].second);
    }
    for (int j = 0; j < left; j++) {
      int cnt_left = a[kek[j]] - 2;
      while (cnt_left && (lmao.size() > 0)) {
        edges.push_back({lmao.back(), kek[j]});
        lmao.pop_back();
        cnt_left--;
      }
    }
    if (lmao.size() != 0) {
      continue;
    }
    cout << "YES " << i << "\n";
    cout << edges.size() << "\n";
    for (auto op : edges) {
      cout << op.first + 1 << " " << op.second + 1 << "\n";
    }
    return 0;
  }
  cout << "NO\n";
}
