#include <bits/stdc++.h>
using namespace std;
template <class Z>
inline bool checkmax(Z &a, Z b) {
  if (a == -1 || a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class Z>
inline bool checkmin(Z &a, Z b) {
  if (a == -1 || a > b) {
    a = b;
    return true;
  }
  return false;
}
int n, m;
struct Node {
  int deg, idx;
  Node() {}
  Node(int a, int b) {
    deg = a;
    idx = b;
  }
  bool operator<(const Node &b) const { return deg < b.deg; }
};
vector<Node> temp;
priority_queue<Node> q;
vector<pair<int, int> > ans;
int main() {
  int i, j;
  int a, b;
  while (scanf("%d%d", &n, &m) != EOF) {
    int ma = 0;
    for (i = 1; i <= n; i++) {
      scanf("%d", &a);
      q.push(Node(a, i));
    }
    int ff = 0;
    ans.clear();
    while (!q.empty()) {
      Node u = q.top();
      q.pop();
      if (q.size() < u.deg) {
        ff = 1;
        break;
      }
      temp.clear();
      for (i = 1; i <= u.deg; i++) {
        Node v = q.top();
        q.pop();
        v.deg--;
        ans.push_back(make_pair(u.idx, v.idx));
        if (v.deg) temp.push_back(v);
      }
      for (i = 0; i < (int)temp.size(); i++) {
        q.push(temp[i]);
      }
    }
    if (ff) {
      puts("No");
      continue;
    }
    puts("Yes");
    printf("%d\n", m / 2);
    for (i = 0; i < (int)ans.size(); i++) {
      printf("%d %d\n", ans[i].first, ans[i].second);
    }
  }
  return 0;
}
