#include <bits/stdc++.h>
using namespace std;
using Int = long long;
constexpr static int mod = 1e9 + 7;
constexpr static int inf = (1 << 30) - 1;
constexpr static Int infll = (1LL << 61) - 1;
int Competitive_Programming =
    (ios_base::sync_with_stdio(false), cin.tie(nullptr),
     cout << fixed << setprecision(15), 0);
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
int main() {
  int N;
  cin >> N;
  vector<vector<pair<int, int>>> deg(2);
  for (int i = 0; i < N; i++) {
    int d;
    cin >> d;
    deg[d > 1].emplace_back(d, i + 1);
  }
  int ans = min<int>(deg[1].size() - 1 + min<int>(deg[0].size(), 2), N - 1);
  vector<pair<int, int>> ret;
  for (int i = 0; i + 1 < deg[1].size(); i++) {
    ret.emplace_back(deg[1][i].second, deg[1][i + 1].second);
    deg[1][i].first--, deg[1][i + 1].first--;
  }
  int now = 0;
  if (deg[0].size() >= 1 and ret.size() >= 1) {
    ret.emplace_back(ret[0].first, deg[0][0].second);
    deg[1][0].first--, deg[0][0].first--;
  }
  reverse(deg[1].begin(), deg[1].end());
  for (int i = 0; i < deg[0].size(); i++) {
    if (deg[0][i].first == 0) continue;
    while (now < deg[1].size() and deg[1][now].first == 0) now++;
    if (now == deg[1].size()) {
      cout << "NO\n";
      return 0;
    }
    deg[1][now].first--, deg[0][i].first--;
    ret.emplace_back(deg[1][now].second, deg[0][i].second);
  }
  cout << "YES " << ans << "\n";
  cout << N - 1 << "\n";
  for (int i = 0; i + 1 < N; i++)
    cout << ret[i].first << " " << ret[i].second << "\n";
}
