#include <cstdio>
#include <algorithm>

#define ll long long
#define db double
#define ull unsigned long long
#define uint unsigned int
#define FIO "train"
#define dbug(...) fprintf(stderr, __VA_ARGS__)

template <typename Y> inline bool updmin(Y &a, Y b){if (a > b) {a = b; return 1;} return 0;}
template <typename Y> inline bool updmax(Y &a, Y b){if (a < b) {a = b; return 1;} return 0;}
template <typename Y> inline Y abs(Y a){if (a < 0) a = -a; return a;}
template <typename Y> inline Y sqr(Y a){return a * a;}

typedef std::pair<int, int> par;
#define fx first
#define fy second
#define mpar std::make_pair
#define pb push_back

int read() {
	int w = 1, q = 0, ch = ' ';
	for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') w = -1;
	for (; ch >= '0' && ch <= '9'; ch = getchar()) q = q * 10 + ch - 48;
	return q * w;
}

inline void FileIO(){freopen(FIO".in", "r", stdin); freopen(FIO".out", "w", stdout);}

const int maxn = 200005;

int n, k, val[maxn << 2];

#define mid ((l + r) >> 1)
#define ls (p << 1)
#define rs (p << 1 | 1)
inline void Build(int p, int l, int r, int v) {
	val[p] = v;
	if (l == r) {
		return;
	}
	Build(ls, l, mid, v);
	Build(rs, mid + 1, r, v);
}

inline void Modify(int p, int l, int r, int ql, int qr, int v) {
	if (l == ql && r == qr) {
		val[p] = v;
		return;
	}
	if (qr <= mid) {
		Modify(ls, l, mid, ql, qr, v);
	} else if (ql > mid) {
		Modify(rs, mid + 1, r, ql, qr, v);
	} else {
		Modify(ls, l, mid, ql, mid, v);
		Modify(rs, mid + 1, r, mid + 1, qr, v);
	}
}

inline int Query(int p, int l, int r, int v) {
	if (l == r) {
		return val[p];
	}
	if (v <= mid) {
		return std::min(val[p], Query(ls, l, mid, v));
	} else {
		return std::min(val[p], Query(rs, mid + 1, r, v));
	}
}

int a[maxn], type[maxn], sum[maxn], l[maxn], r[maxn], uni[maxn], tot;
ll f[maxn], ans;

int main() {
	n = read();
	k = read();
	for (int i = 1; i <= n; i++) {
		a[i] = read();
		type[i] = read();
		if (type[i] == 1 && a[i] * 2 > k) {
			puts("-1");
			return 0;
		}
		sum[i] = ((sum[i - 1] - 2 * a[i]) % k + k) % k;
	}
	for (int i = 1; i <= n; i++) {
		if (type[i] == 2) {
			l[i] = 0;
			r[i] = k - 1;
		} else {
			l[i] = sum[i - 1];
			r[i] = sum[i];
		}
		uni[++tot] = l[i];
		uni[++tot] = r[i];
	}
	std::sort(uni + 1, uni + 1 + tot);
	tot = std::unique(uni + 1, uni + 1 + tot) - uni - 1;
	for (int i = 1; i <= n; i++) {
		l[i] = std::lower_bound(uni + 1, uni + 1 + tot, l[i]) - uni;
		r[i] = std::lower_bound(uni + 1, uni + 1 + tot, r[i]) - uni;
//		printf("(%d, %d)\n", l[i], r[i]);
	}
	Build(1, 1, tot, n + 1);
	for (int i = n, p; i; --i) {
		p = Query(1, 1, tot, l[i]);
		if (p != n + 1) {
			f[i] = f[p] + (uni[l[p]] - uni[l[i]] + k) % k;
		}
		if (l[i] <= r[i]) {
			if (r[i] < tot) {
				Modify(1, 1, tot, r[i] + 1, tot, i);
			}
			if (l[i] > 1) {
				Modify(1, 1, tot, 1, l[i] - 1, i);
			}
		} else {
			if (r[i] + 1 < l[i]) {
				Modify(1, 1, tot, r[i] + 1, l[i] - 1, i);
			}
		}
	}
	ll ans = 0x3f3f3f3f3f3f3f3f;
	for (int i = 1, p; i <= n; i++) {
		p = Query(1, 1, tot, l[i]);
		if (p == n + 1) {
			ans = 0;
		} else {
			updmin(ans, f[p] + (uni[l[p]] - uni[l[i]] + k) % k);
		}
		p = Query(1, 1, tot, r[i]);
		if (p == n + 1) {
			ans = 0;
		} else {
			updmin(ans, f[p] + (uni[l[p]] - uni[r[i]] + k) % k);
		}
	}
	for (int i = 1; i <= n; i++) {
		ans += a[i] * 2;
	}
	printf("%lld\n", ans);
	return 0;
}



Measured memory_bytes: 7552