9 13
6 14 19 5 -5 6 -10 20 8
 8 9
6 -1 5 -5 -8 -7 -8 -7
 10 7
-9 3 -4 -22 4 -17 0 -14 3 -2
 6 2
-2 3 0 -2 0 0
 5 10
-8 -24 0 -22 12
 5 13756
-2 -9 -10 0 10
 7 3
1 -3 0 3 -1 0 2
 9 9
-3 2 0 -2 -7 -1 0 5 3
 2 3
2 0
 19 78701
1 0 -1 0 -1 -1 0 1 0 -1 1 1 -1 1 0 0 -1 0 0
 5 4
-1 0 0 1 -1
 6 4
-1 0 2 -4 0 5
 20 23036
-1 1 -1 -1 -1 -1 1 -1 -1 0 0 1 1 0 0 1 0 0 -1 -1
 5 4
-1 0 -3 0 3
 12 82016
1 -2 -1 -1 -2 -1 0 -2 -1 1 -2 2
 7 4
-6 0 2 -3 0 4 0
 4 4
2 2 0 1
 6 1
-3 0 0 0 -2 3
 8 26
-4 9 -14 -11 0 7 23 -15
 20 23079
0 1 1 -1 1 0 -1 -1 0 0 1 -1 1 1 1 0 0 1 0 1
 1 1
1
 7 8555
-2 -3 -2 3 0 -2 0
 4 100
-100 0 -50 100
 3 14
12 12 -8
 1 1
2
 10 23
9 7 14 16 -13 -22 24 -3 -12 14
 8 11
12 -12 -9 3 -22 -21 1 3
 19 49926
-2 0 2 0 0 -2 2 -1 -1 0 0 0 1 0 1 1 -2 2 2
 16 76798
-1 11 -7 -4 0 -11 -12 3 0 -7 6 -4 8 6 5 -10
 9 5
-2 0 3 -4 0 4 -3 -2 0

-1
 -1
 1
 1
 1
 1
 -1
 2
 0
 1
 1
 -1
 1
 1
 1
 1
 -1
 1
 -1
 0
 0
 1
 1
 -1
 -1
 -1
 -1
 1
 1
 1

#include <bits/stdc++.h>
using namespace std;
long long dp[100001];
long long need[100001];
long long id[100001];
long long state[100001];
int dpcnt = 0;
bool UsedItself[100001];
long long NeedTree[400001];
long long StateTree[400001];
long long add[400001];
void Push(int node, int l, int r) {
  if (l == r) {
    StateTree[node] += add[node];
    add[node] = 0;
  } else {
    StateTree[node] += add[node] * (r - l + 1);
    add[node * 2] += add[node];
    add[node * 2 + 1] += add[node];
    add[node] = 0;
  }
}
void BuildStateTree(int node, int l, int r) {
  if (l == r)
    StateTree[node] = state[l];
  else {
    BuildStateTree(node * 2, l, (l + r) / 2);
    BuildStateTree(node * 2 + 1, (l + r) / 2 + 1, r);
    StateTree[node] = max(StateTree[node * 2], StateTree[node * 2 + 1]);
  }
}
long long GetMax(int node, int l, int r, int a, int b) {
  Push(node, l, r);
  if (l > b || r < a)
    return -2e9;
  else if (l >= a && r <= b)
    return StateTree[node];
  else
    return max(GetMax(node * 2, l, (l + r) / 2, a, b),
               GetMax(node * 2 + 1, (l + r) / 2 + 1, r, a, b));
}
void Add(int node, int l, int r, int a, int b, int x) {
  Push(node, l, r);
  if (l > b || r < a) return;
  if (l >= a && r <= b) {
    add[node] += x;
    Push(node, l, r);
  } else {
    Add(node * 2, l, (l + r) / 2, a, b, x);
    Add(node * 2 + 1, (l + r) / 2 + 1, r, a, b, x);
    StateTree[node] = StateTree[node * 2] + StateTree[node * 2 + 1];
  }
}
int main() {
  long long n, d;
  cin >> n >> d;
  long long cnt = 0;
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    if (a != 0) {
      cnt += a;
      if (cnt > d) {
        cout << -1;
        return 0;
      }
      state[i] = cnt;
    } else {
      dpcnt++;
      state[i] = -2e16;
      id[dpcnt] = i;
      need[dpcnt] = max(0ll, -cnt);
      cnt = max(cnt, 0ll);
    }
  }
  if (!dpcnt) {
    cout << 0;
    return 0;
  }
  BuildStateTree(1, 1, n);
  int l = 0;
  for (int i = 1; i <= dpcnt; i++) {
    Add(1, 1, n, id[l] + 1, id[i], need[i]);
    while (GetMax(1, 1, n, id[l] + 1, id[i]) > d) l++;
    if (i == l) {
      UsedItself[i] = true;
      dp[i] = dp[i - 1] + 1;
    } else if (!need[i]) {
      dp[i] = dp[i - 1];
    } else if (UsedItself[l]) {
      dp[i] = dp[l];
    } else {
      dp[i] = dp[l] + 1;
    }
  }
  cout << dp[dpcnt];
  return 0;
}
