#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define pll pair<LL,LL>
#define x first
#define y second
#define pi acos(-1)
#define sqr(x) ((x)*(x))
#define pdd pair<double,double>
#define MEMS(x) memset(x,-1,sizeof(x))
#define MEM(x) memset(x,0,sizeof(x))
#define less Less
#define EPS 1e-4
#define arg ARG
#define cpdd const pdd
#define rank Rank
#define KK 500
#define MXN 200005
struct node{
    node *l,*r;
    LL Min;
    int a,b;
    int tag;
    node(int _a,int _b):a(_a),b(_b),l(NULL),r(NULL),Min(0){
        tag=0;
    }
}*root;
LL Min(node *n){
    return n->tag?1e18:n->Min;
}
void pull(node *n){
    n->Min=min(Min(n->l),Min(n->r));
}
void push(node *n){
    if(n->tag){
        n->l->tag=1;
        n->r->tag=1;
        n->tag=0;
    }
}
void build(node *n,int *a){
    if(n->a==n->b){
        n->Min=a[n->a];
        return ;
    }
    int mid=(n->a+n->b)/2;
    n->l=new node(n->a,mid);
    n->r=new node(mid+1,n->b);
    build(n->l,a);
    build(n->r,a);
    pull(n);
}
void revise(node *n,int l,int r){
    if(l>r)return ;
    if(n->a>=l&&n->b<=r){
        n->tag=1;
        return ;
    }
    if(n->b<l||n->a>r){
        return;
    }
    push(n);
    revise(n->l,l,r);
    revise(n->r,l,r);
    pull(n);
}
void Set(node *n,int x,LL k){
    if(n->a==n->b){
        n->tag=0;
        n->Min=k;
        return ;
    }
    int mid=(n->a+n->b)/2;
    push(n);
    if(x<=mid)
        Set(n->l,x,k);
    else
        Set(n->r,x,k);
    pull(n);
}
LL query(node *n,int l,int r){
    if(l>r)return 1e18;
    if(n->a>=l&&n->b<=r){
        return Min(n);
    }
    if(n->b<l||n->a>r)return 1e18;
    push(n);
    LL res=min(query(n->l,l,r),query(n->r,l,r));
    pull(n);
    return res;
}
void go(int x,int k,int r){
  //  printf("%lld %d %d\n",query(root,x,r),x,r);
    Set(root,x,min(query(root,x,r),Min(root)+k));
}
int main(){
    int n,k;
    scanf("%d %d",&n,&k);
    int a[100005],b[100005];
    for(int i = 0;i<n;i++){
        scanf("%d %d",&a[i],&b[i]);
        if(a[i]*2>k&&b[i]==1){
            printf("-1\n");
            return 0;
        }
    }
    vector<pll> p;//[100005];
    LL sum=0;
    for(int i = 0;i<n;i++){
        LL Next=sum+a[i];
        if(b[i]==2){
            //p[i]=mp(0,k-1);
        }
        else{
            p.pb(mp((-2*sum%k+k)%k,(-2*Next%k+k)%k));
         //    printf("%lld %lld\n",p.back().x,p.back().y);
        }
        sum=Next;
       
    }
    map<LL,int> m;
    int index=0;
    for(auto it:p){
        m[it.x];
        m[it.y];
    }
    int val[200005];
    for(auto &it:m){
        it.y=++index;
        val[index]=it.x;
    }
    root = new node(1,index);
    build(root,val);
    reverse(p.begin(),p.end());
    for(auto it:p){
        go(m[it.x],k,index);
        go(m[it.y],k,index);
        if(it.x<=it.y){
            revise(root,1,m[it.x]-1);
            revise(root,m[it.y]+1,index);
        }
        else{
            revise(root,m[it.y]+1,m[it.x]-1);
        }
    }
    LL ans=1e18;
    for(int i = 1 ;i<=index;i++){
        ans=min(ans,query(root,i,i)-val[i]);
    }
    printf("%lld\n",ans+sum*2);
}

Measured memory_bytes: 20592