#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
struct wf{
	LL l,r,w;
}tree[100005<<2];
LL sta[100005<<1],l[100005],r[100005],n,m,k,sum[100005];
LL a[100005],b[100005],dp[100005<<1],N,ans;
void pushdown(LL root)
{
	if (tree[root].w)
	{
		tree[root<<1].w=tree[root<<1|1].w=tree[root].w;
		tree[root].w=0;
	}
}
void build(LL l,LL r,LL root)
{
	tree[root].l=l;
	tree[root].r=r;
	if (l==r) return;
	build(l,l+r>>1,root<<1);
	build((l+r>>1)+1,r,root<<1|1);
}
void change(LL l,LL r,LL x,LL root)
{
	if (tree[root].l>r||tree[root].r<l) return;
	if (tree[root].l>=l&&tree[root].r<=r)
	{
		tree[root].w=x;
		return;
	}
	pushdown(root);
	change(l,r,x,root<<1);
	change(l,r,x,root<<1|1);
}
LL ask(LL l,LL root)
{
	if (tree[root].l>l||tree[root].r<l) return 0;
	if (tree[root].l==tree[root].r) return tree[root].w;
	pushdown(root);
	return ask(l,root<<1)+ask(l,root<<1|1);
}
int main()
{
	scanf("%lld%lld",&n,&k);
	for (LL i=1;i<=n;++i)
	{
		scanf("%lld%lld",&a[i],&b[i]);
		sum[i]=sum[i-1]+a[i];
		if (b[i]==1&&k<2*a[i])
		{
			printf("-1");
			return 0;
		}
	}
	for (LL i=n;i;--i)
	{
		if (b[i]==2) l[i]=0,r[i]=k-1;
		else l[i]=(-2*sum[i-1]%k+k)%k,r[i]=(-2*sum[i]%k+k)%k;
		sta[++N]=l[i],sta[++N]=r[i];
	}
	sort(sta+1,sta+N+1);
	N=unique(sta+1,sta+N+1)-sta-1;
	build(1,N,1);
	for (LL i=n;i;--i)
	{
		l[i]=lower_bound(sta+1,sta+N+1,l[i])-sta;
		r[i]=lower_bound(sta+1,sta+N+1,r[i])-sta;
		LL w=ask(l[i],1);
		if (w!=0) dp[i]=dp[w]+(sta[l[w]]-sta[l[i]]+k)%k;
		else dp[i]=0;
		if (l[i]>r[i]) change(r[i]+1,l[i]-1,i,1);
		else
		{
			change(1,l[i]-1,i,1);
			change(r[i]+1,N,i,1);
		}
	}
	ans=dp[1];
	for (LL i=N;i;--i)
	{
		//printf("%lld ",ans);
		LL w=ask(i,1);
		if (!w) ans=0;
		else ans=min(ans,dp[w]+(sta[l[w]]-sta[i]+k)%k);
	}
	printf("%lld",2*sum[n]+ans);
	return 0;
}