#include <bits/stdc++.h>
using namespace std;
int deg[505] = {0};
vector<pair<int, int> > vv;
vector<int> a, b, vt[505];
int mark[505];
inline void add(int u, int v) {
  deg[u]--;
  deg[v]--;
  vv.push_back(make_pair(u, v));
  vt[u].push_back(v);
  vt[v].push_back(u);
  return;
}
inline void dfs(int u, int p, int l) {
  mark[u] = l;
  for (int v : vt[u]) {
    if (v != p) dfs(v, u, l + 1);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    if (x == 1)
      a.push_back(i);
    else
      b.push_back(i);
    deg[i] = x;
  }
  for (int i = 0; i < (int)b.size() - 1; i++) {
    int u = b[i];
    int v = b[i + 1];
    add(u, v);
  }
  if (b.size() == 1) {
    if (a.size()) {
      add(a.back(), b.back());
      a.pop_back();
    }
  }
  if (b.size() >= 2) {
    if (a.size()) {
      add(a.back(), b.back());
      a.pop_back();
    }
    if (a.size()) {
      add(a.back(), b[0]);
      a.pop_back();
    }
  }
  while (a.size()) {
    int x = a.back();
    for (int i = 0; i < b.size(); i++) {
      int y = b[i];
      if (deg[y] > 0) {
        add(x, y);
        break;
      }
    }
    a.pop_back();
  }
  memset((mark), (-1), sizeof((mark)));
  ;
  dfs(1, -1, 0);
  int root = 1;
  int mm = 0;
  for (int i = 1; i <= n; i++) {
    if (mark[i] == -1) {
      printf("NO\n");
      return 0;
    }
    if (mm < mark[i]) {
      mm = mark[i];
      root = i;
    }
  }
  memset((mark), (-1), sizeof((mark)));
  ;
  dfs(root, -1, 0);
  for (int i = 1; i <= n; i++) {
    mm = max(mark[i], mm);
  }
  printf("YES %d\n", mm);
  printf("%d\n", vv.size());
  for (pair<int, int> x : vv) {
    printf("%d %d\n", x.first, x.second);
  }
  return 0;
}
