#include "bits/stdc++.h"
using namespace std;

typedef long long ll;
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)

//* 便利な変数
namespace {
	int dx4[] = { 1, -1, 0, 0 };
	int dy4[] = { 0, 0, 1, -1 };

	int dx8[] = { 1, -1, 0, 0, 1, 1, -1, -1 };
	int dy8[] = { 0, 0, -1, 1, -1, 1, -1, 1 };

	int mDays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	ll A, B, C, D, E, F, G, H, I, J, K, L, M,
		N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
}
template <typename T>
vector<T> INP(ll n)
{
	vector<T> x;
	REP(i, n) {
		T tmp; cin >> tmp;
		x.push_back(tmp);
	}
	return move(x);
}
//* n文字1行の文字列を入力，一文字ごとの配列を返す
vector<char> SPRIT_STRING(ll n)
{
	string str; cin >> str;
	vector<char> cs(n);
	REP(i, n) cs[i] = str[i];
	return move(cs);
}
//* 文字列中から文字列を検索して別の文字列に置換する
void strReplace(std::string& str, const std::string& from, const std::string& to) {
	std::string::size_type pos = 0;
	while (pos = str.find(from, pos), pos != std::string::npos) {
		str.replace(pos, from.length(), to);
		pos += to.length();
	}
}
//* 素数判定 is_prime<unsigned>(N)
template<typename T, std::enable_if_t<std::is_unsigned<T>::value, std::nullptr_t> = nullptr>
bool is_prime(const T n) {
	if (n < 4) return n == 2 || n == 3;
	if (n % 2 == 0 || n % 3 == 0 || (n % 6 != 1 && n % 6 != 5)) return false;
	for (T i = 5; i * i <= n; i += 6) if (n % i == 0 || n % (i + 2) == 0) return false;
	return true;
}
//* 組み合わせ計算
inline unsigned long long NChooseK(const unsigned long long& n, const unsigned long long& k)
{
	if (n  < k) return 0;
	if (0 == n) return 0;
	if (0 == k) return 1;
	if (n == k) return 1;
	if (1 == k) return n;
	typedef unsigned long long value_type;
	value_type* table = new value_type[static_cast<std::size_t>(n * n)];
	std::fill_n(table, n * n, 0);
	class n_choose_k_impl
	{
	public:

		n_choose_k_impl(value_type* table, const value_type& dimension)
			: table_(table),
			dimension_(dimension)
		{}

		inline value_type& lookup(const value_type& n, const value_type& k)
		{
			return table_[dimension_ * n + k];
		}

		inline value_type compute(const value_type& n, const value_type& k)
		{
			if ((0 == k) || (k == n))
				return 1;
			value_type v1 = lookup(n - 1, k - 1);
			if (0 == v1)
				v1 = lookup(n - 1, k - 1) = compute(n - 1, k - 1);
			value_type v2 = lookup(n - 1, k);
			if (0 == v2)
				v2 = lookup(n - 1, k) = compute(n - 1, k);
			return v1 + v2;
		}

		value_type* table_;
		value_type dimension_;
	};
	value_type result = n_choose_k_impl(table, n).compute(n, k);
	delete[] table;
	return result;
}
//* 座標nx, nyがWidth,Heightの領域内にあるかどうかのチェック
inline bool rangeCheck2D(int nx, int ny, int Width, int Height)
{
	return nx >= 0 and nx < Width and ny >= 0 and ny < Height;
}
//* bit全探索
/*
for (int i = 0; i < 1<<N; i++) {
	REP(j, N)
		if ((1 & i >> j) == 1) {;}
}
*/

// CodeForces
// 複雑な条件を全探索する
namespace MashaAndBears {
	int V1, V2, V3, Vm;
	bool check(int c1, int c2, int c3) {
		int th = 2 * Vm;
		if ((c1 > c2) and (c2 > c3) and
			(V1 <= c1) and (V2 <= c2) and (V3 <= c3) and
			(2*V1 >= c1) and (2*V2 >= c2) and (2*V3 >= c3) and
			(Vm <= c3) and
			(th >= c3) and (th < c2) and (th < c1))
			return true;
		return false;
	}
	void MashaAndBears()
	{
		cin >> V1 >> V2 >> V3 >> Vm;
		FOR(i, 1, 210) {
			FOR(j, 1, 210) {
				FOR(k, 1, 210) {
					if (check(i, j, k)) {
						cout << i << endl << j << endl << k << endl;
						return;
					}
				}
			}
		}
		cout << "-1" << endl;
	}
}

namespace agc001a {
	void agc001a()
	{
		cin >> N;
		vector<int> ls(N*2);
		REP(i, N*2) cin >> ls[i];
		sort(ls.begin(), ls.end());
		int cnt = 0;
		for (int i = 0; i < 2 * N; i += 2)
			cnt += min(ls[i], ls[i + 1]);
		cout << cnt << endl;
	}
}

namespace arc080a {
	void arc080a()
	{
		cin >> N;
		int four = 0, two = 0, zero = 0;
		REP(i, N) {
			int a; cin >> a;
			if (a % 4 == 0) four++;
			else if (a % 2 == 0) two++;
			else zero++;
		}
		if (two == 0)
			if (four + 1 >= zero)
				cout << "Yes" << endl;
			else
				cout << "No" << endl;
		else
			if (four >= zero)
				cout << "Yes" << endl;
			else
				cout << "No" << endl;
	}
}

namespace arc079a {
	void arc079a()
	{
		cin >> N >> M;
		vector< pair<int, int> > data(M);
		vector<int> oneHop;
		for (int m = 0; m < M; ++m) {
			int a, b; cin >> a >> b;
			if (a == 1) oneHop.push_back(b);
			else if (b == 1) oneHop.push_back(a);
			else {
				if (a > b) swap(a, b);
				data[m].first = a;
				data[m].second = b;
			}
		}

		sort(oneHop.begin(), oneHop.end());
		sort(data.begin(), data.end());
		REP(i, oneHop.size()) {
			int current = oneHop[i];
			vector< pair<int, int> >::iterator itr = lower_bound(data.begin(), data.end(), make_pair(current, (int)N));
			if (itr != data.end() and *itr == make_pair(current, (int)N)) {
				cout << "POSSIBLE" << endl;
				return;
			}
		}

		cout << "IMPOSSIBLE" << endl;
	}
}

namespace arc063a {
	void arc063a()
	{
		string str; cin >> str;
		char c = str[0];
		int cnt = 0;
		FOR(i, 1, str.size()) {
			if (c != str[i])
				cnt++;
			c = str[i];
		}
		cout << cnt << endl;
	}
}

namespace arc064a {
	void arc064a()
	{
		cin >> N >> X;
		vector<ll> a(N);
		REP(i, N) cin >> a[i];
		ll cnt = 0;
		if (N == 2 and (a[0] + a[1] > X)) {
			cnt += a[0] + a[1] - X;
		}
		else {
			for (int i = 1; i < N; i += 2) {
				ll left = a[i] + a[i - 1];
				ll sub;
				if (left > X) {
					sub = left - X;
					cnt += sub;
					if (a[i] >= sub) a[i] -= sub;
					else {
						a[i - 1] -= sub - a[i];
						a[i] = 0;
					}
				}
				if (i + 1 >= N) continue;
				ll right = a[i] + a[i + 1];
				if (right > X) {
					sub = right - X;
					cnt += sub;
					if (a[i + 1] >= sub) a[i + 1] -= sub;
					else {
						a[i] -= sub - a[i + 1];
						a[i + 1] = 0;
					}
				}
			}
		}
		cout << cnt << endl;
	}
}


int main()
{
	//abc017c::abc017c();
	//abc083c::abc083c();
	arc064a::arc064a();
	//agc001a::agc001a();
	return 0;
}

Measured memory_bytes: 1024