#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
using namespace std;
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int lcm(int a, int b) { return a / gcd(a, b) * b; }
long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const int INF = 1e9 + 7;
const long long INFLL = 1e17 + 7;
const long double EPS = 1e-9;
mt19937 myRand(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 myRand64(chrono::steady_clock::now().time_since_epoch().count());
signed main(void) {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, z = 0;
  cin >> n;
  vector<pair<int, int> > v(n);
  for (int i = 0; i < n; ++i) {
    cin >> v[i].first;
    v[i].second = i + 1;
    z += v[i].first;
  }
  if (z < n - 1) {
    cout << "NO";
    return 0;
  }
  sort(v.begin(), v.end());
  int d = 0;
  vector<pair<int, int> > ans;
  for (int i = n - 1; i >= 1; --i) {
    if (!v[i].first) {
      int j = n - 1, k = i - 1;
      bool flag = 0;
      while (j >= 0 && k >= 0) {
        if (k == j && v[j].first) {
          cout << "NO";
          return 0;
        }
        if (!v[j].first)
          j--;
        else if (!v[k].first)
          k--;
        else {
          if (j == n - 1 && !flag) {
            d++;
            flag = 1;
          }
          v[k].first--;
          v[j].first--;
          ans.push_back(make_pair(v[k].second, v[j].second));
        }
      }
      break;
    }
    v[i].first--;
    v[i - 1].first--;
    d++;
    ans.push_back(make_pair(v[i].second, v[i - 1].second));
  }
  cout << "YES " << d << endl << (int)ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); ++i) {
    cout << ans[i].first << ' ' << ans[i].second << '\n';
  }
}
