#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff, mod = (int)1e9 + 7, dxy[] = {-1, 0, 1, 0, -1};
const long long INF = 1ll << 60;
const double pi = acos(-1), eps = 1e-6;
template <class T>
void rd(T &x) {
  x = 0;
  char c;
  while (c = getchar(), c < 48)
    ;
  do x = (x << 3) + (x << 1) + (c ^ 48);
  while (c = getchar(), c > 47);
}
template <class T>
void rec_pt(T x) {
  if (!x) return;
  rec_pt(x / 10);
  putchar(x % 10 ^ 48);
}
template <class T>
void pt(T x) {
  if (!x)
    putchar('0');
  else
    rec_pt(x);
}
template <class T>
inline void ptn(T x) {
  pt(x), putchar('\n');
}
template <class T>
inline void Max(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void Min(T &a, T b) {
  if (b < a) a = b;
}
template <class T>
T gcd(T a, T b) {
  return b ? gcd(b, a % b) : a;
}
inline void mod_add(int &a, int b, int m = mod) {
  if ((a += b) >= m) a -= m;
}
inline void mod_minus(int &a, int b, int m = mod) {
  if ((a -= b) < 0) a += m;
}
int mod_pow(int a, int b, int m = mod) {
  int res = 1;
  for (; b; b >>= 1, a = (long long)a * a % m)
    if (b & 1) res = (long long)res * a % m;
  return res;
}
inline int calc_inv(int x, int m = mod) { return mod_pow(x, m - 2); }
const int N = (int)2e5 + 5;
int cnt, deg[N];
pair<int, int> ans[N >> 1], elm[N >> 1];
priority_queue<pair<int, int> > pque;
bool consider(pair<int, int> tar) {
  for (register int i = (0), _t = (tar.first); i < _t; ++i) {
    if (pque.empty()) return false;
    elm[i] = pque.top();
    pque.pop();
    if (!elm[i].first) return false;
    ans[cnt++] = pair<int, int>(tar.second, elm[i].second);
  }
  for (register int i = (0), _t = (tar.first); i < _t; ++i)
    pque.push(pair<int, int>(elm[i].first - 1, elm[i].second));
  return true;
}
int main() {
  int n, tot;
  rd(n), rd(tot);
  if (tot & 1) return puts("No");
  tot >>= 1;
  for (register int i = (0), _t = (n); i < _t; ++i) {
    rd(deg[i]);
    pque.push(pair<int, int>(deg[i], i));
  }
  for (; ((int)(pque).size());) {
    pair<int, int> tar = pque.top();
    pque.pop();
    if (!tar.first) break;
    if (!consider(tar)) return puts("No");
  }
  puts("Yes");
  ptn(tot);
  for (register int i = (0), _t = (tot); i < _t; ++i)
    pt(ans[i].first + 1), putchar(' '), ptn(ans[i].second + 1);
  return 0;
}
