#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return x * f;
}
struct Node {
  int x, id;
  bool operator<(const Node &A) const { return x < A.x; }
} A[1000], B[1000], C[1000];
int u[1000], v[1000];
int main() {
  int n = read(), sum = 0;
  for (int i = 1; i <= n; ++i) A[i].x = read(), A[i].id = i, sum += A[i].x;
  if (sum / 2 < n - 1) {
    puts("NO");
    return 0;
  }
  int leaf = 0, cnt = 0;
  for (int i = 1; i <= n; ++i) {
    if (A[i].x == 1) leaf++;
  }
  cnt = n - leaf;
  if (cnt == 0) {
    cout << "NO";
    return 0;
  }
  if (cnt == 1) {
    int t = -1;
    for (int i = 1; i <= n; ++i)
      if (A[i].x == n - 1) t = A[i].id;
    if (t == -1) {
      puts("NO");
      return 0;
    }
    puts("YES 2");
    cout << n - 1 << "\n";
    for (int i = 1; i <= n; ++i)
      if (i != t) printf("%d %d\n", t, i);
    return 0;
  }
  int p1 = 0, p2 = 0;
  for (int i = 1; i <= n; ++i)
    if (A[i].x == 1)
      B[++p1] = A[i];
    else
      C[++p2] = A[i];
  int ans = 0;
  for (int i = 1; i < p2; ++i) u[++ans] = C[i].id, v[ans] = C[i + 1].id;
  if (p1 == 0) {
    printf("YES %d\n", p2 - 1);
  } else if (p1 == 1) {
    printf("YES %d\n", p2);
    u[++ans] = B[1].id, v[ans] = C[1].id;
  } else if (p1 == 2) {
    printf("YES %d\n", p2 + 1);
    u[++ans] = B[1].id, v[ans] = C[1].id;
    u[++ans] = B[2].id, v[ans] = C[p2].id;
  } else {
    printf("YES %d\n", p2 + 1);
    u[++ans] = B[1].id, v[ans] = C[1].id;
    u[++ans] = B[2].id, v[ans] = C[p2].id;
    int now = 3;
    for (int i = 1; i <= p2; ++i) {
      int t = C[i].x - 2;
      while (t >= 1) {
        if (now <= p1) u[++ans] = B[now].id, v[ans] = C[i].id, now++;
        t--;
      }
      if (now > p1) break;
    }
  }
  cout << ans << "\n";
  for (int i = 1; i <= ans; ++i) {
    cout << u[i] << " " << v[i] << "\n";
  }
  return 0;
}
