#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
int sz[N];
vector<int> g[N], g2[N];
signed main() {
  int n;
  std::cin >> n;
  int sum = 0;
  vector<int> nonOnes, ones;
  for (int i = 0; i < n; ++i) {
    std::cin >> sz[i];
    sum += sz[i];
    if (sz[i] > 1) {
      nonOnes.push_back(i);
    } else {
      ones.push_back(i);
    }
  }
  if (sum < 2 * n - 2) {
    std::cout << "NO";
    return 0;
  }
  for (int i = 1; i < nonOnes.size(); ++i) {
    sz[nonOnes[i - 1]]--;
    sz[nonOnes[i]]--;
    g[nonOnes[i - 1]].push_back(nonOnes[i]);
    g2[nonOnes[i - 1]].push_back(nonOnes[i]);
    g2[nonOnes[i]].push_back(nonOnes[i - 1]);
  }
  bool f = false, s = false;
  for (auto d : ones) {
    bool fl = false;
    if (!f && sz[nonOnes[0]]) {
      g[d].push_back(nonOnes[0]);
      g2[d].push_back(nonOnes[0]);
      g2[nonOnes[0]].push_back(d);
      sz[nonOnes[0]]--;
      f = true;
      continue;
    }
    if (!s && sz[nonOnes.back()]) {
      g[d].push_back(nonOnes.back());
      g2[d].push_back(nonOnes.back());
      g2[nonOnes.back()].push_back(d);
      sz[nonOnes.back()]--;
      s = true;
      continue;
    }
    for (auto x : nonOnes) {
      if (sz[x]) {
        g[d].push_back(x);
        g2[x].push_back(d);
        g2[d].push_back(d);
        sz[x]--;
        fl = true;
        break;
      }
    }
    if (!fl) {
      std::cout << "NO";
      return 0;
    }
  }
  int answ = 0, m = 0;
  for (int i = 0; i < n; ++i) {
    m += g[i].size();
  }
  for (int i = 0; i < n; ++i) {
    vector<int> d(n, 1e9);
    std::queue<int> bfs;
    d[i] = 0;
    bfs.push(i);
    while (!bfs.empty()) {
      int v = bfs.front();
      bfs.pop();
      for (auto e : g2[v]) {
        if (d[e] > d[v] + 1) {
          answ = std::max(answ, d[v] + 1);
          d[e] = d[v] + 1;
          bfs.push(e);
        }
      }
    }
  }
  std::cout << "YES " << answ << '\n' << m << '\n';
  for (int i = 0; i < n; ++i) {
    for (auto e : g[i]) {
      std::cout << i + 1 << ' ' << e + 1 << '\n';
    }
  }
}
