#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 10;
class NODE {
 public:
  int id;
  int v;
};
void swap(NODE &a, NODE &b) {
  NODE temp = a;
  a = b;
  b = temp;
}
class HEAP {
 public:
  int size;
  NODE node[N];
  void init() { size = 0; }
  void sink(int id) {
    int temp = id;
    if (id * 2 <= size && node[id * 2].v > node[id].v) temp = id * 2;
    if (id * 2 + 1 <= size && node[id * 2 + 1].v > node[temp].v)
      temp = id * 2 + 1;
    if (temp != id) {
      swap(node[id], node[temp]);
      sink(temp);
    }
  }
  void swim(int id) {
    if (id == 1) return;
    if (node[id].v > node[id >> 1].v) {
      swap(node[id], node[id >> 1]);
      swim(id >> 1);
    }
  }
  NODE top() { return node[1]; }
  void pop() {
    swap(node[1], node[size--]);
    sink(1);
  }
  void add(NODE p) {
    size++;
    node[size] = p;
    swim(size);
  }
};
bool ok;
int m;
int n;
int v[N];
int ans[N][2];
NODE que[N];
HEAP heap;
void ri() {
  int i;
  NODE p;
  heap.init();
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d", &v[i]);
    p.v = v[i];
    p.id = i;
    heap.add(p);
  }
}
bool solve() {
  int cnt = 0;
  int hi;
  int i;
  NODE a;
  for (i = 1; i <= n; i++) {
    hi = 0;
    while (v[i]--) {
      do {
        if (heap.size == 0) return true;
        a = heap.top();
        heap.pop();
      } while (a.id <= i);
      a.v--;
      que[hi++] = a;
      if (v[a.id] == 0) return true;
      v[a.id]--;
      ans[cnt][0] = i;
      ans[cnt][1] = a.id;
      cnt++;
    }
    v[i] = 0;
    while (hi--) heap.add(que[hi]);
  }
  return cnt * 2 != m;
}
void print() {
  int i;
  if (ok)
    printf("No\n");
  else {
    printf("Yes\n%d\n", m / 2);
    for (i = 0; i < m / 2; i++) printf("%d %d\n", ans[i][0], ans[i][1]);
  }
}
int main() {
  ri();
  ok = solve();
  print();
  return 0;
}
