#include <bits/stdc++.h>
#define pb push_back
#define all(x) x.begin(),x.end()
#define cmin(a,b) (a>b?a=b:a)
#define cmax(a,b) (a<b?a=b:a)
#define lop(i,s,t) for(int i=s;i<(t);++i)
#define rep(i,s,t) for(int i=s;i<=(t);++i)
#define dec(i,s,t) for(int i=s;i>=(t);--i)
#define fore(i,v) for(int i=g[v],d=es[i].d;i;i=es[i].nxt,d=es[i].d)
using namespace std;
 
#define Pr(f,...) printf(f,##__VA_ARGS__),fflush(stdout)

typedef int inte;
typedef long long ll;
#define int ll

const int N=4e5+50; 
const ll oo=1e18; 


int tr[N<<1]; 
void build(int v,int l,int r,int x){
	if(l==r)tr[v]=x; 
	else{
		int mid=(l+r)>>1;
		tr[v]=x;
		build(v<<1,l,mid,x); 
		build(v<<1^1,mid+1,r,x); 
	}
}

void update(int v,int l,int r,int s,int t,int x){
	if(r<s||l>t);
	else if(s<=l&&r<=t)cmin(tr[v],x); 
	else{
		int mid=(l+r)>>1;
		update(v<<1,l,mid,s,t,x);
		update(v<<1^1,mid+1,r,s,t,x); 
	}
}
int query(int v,int l,int r,int p){
	if(l==r)return tr[v]; 
	else{
		int mid=(l+r)>>1;
		if(p<=mid)return min(tr[v],query(v<<1,l,mid,p));
		else return min(tr[v],query(v<<1^1,mid+1,r,p)); 
	}
}

int n,m,k,a[N],b[N],disc[N],l[N],r[N];
ll f[N],sum[N];
int dist(int x,int y){ return (x-y+k)%k; }

inte main(inte argc,char *argv[]){
#ifdef CURIOUSCAT
	freopen("dat.in","r",stdin); 
	//freopen("my.out","w",stdout); 
#endif
	scanf("%lld%lld",&n,&k); 
	rep(i,1,n){
		scanf("%lld%lld",a+i,b+i); 
		if(b[i]==1&&a[i]*2>k){
			puts("-1"); 
			return 0; 
		}
		sum[i]=sum[i-1]-2ll*a[i]; 
		sum[i]=(sum[i]%k+k)%k; 
		//cout<<sum[i]<<endl;
	}
	rep(i,1,n){
		if(b[i]==2){
			l[i]=0,r[i]=k-1; 
		}else{
			l[i]=sum[i-1],r[i]=sum[i]; 
		}
		disc[++m]=l[i]; 
		disc[++m]=r[i]; 
	}
	//for(int i=1;i<=m;++i)printf("F:%lld\n",disc[i]); 
	sort(disc+1,disc+m+1); 
	m=unique(disc+1,disc+m+1)-disc-1; 
	//printf("%lld,%lld\n",disc[1],disc[m]); 
	rep(i,1,n){
		l[i]=lower_bound(disc+1,disc+m+1,l[i])-disc;
		r[i]=lower_bound(disc+1,disc+m+1,r[i])-disc;
		//printf("%lld,%lld\n",l[i],r[i]); 
	}
	build(1,1,m,n+1); 
	dec(i,n,1){
		int p=query(1,1,m,l[i]); 
		if(p!=n+1){
			f[i]=f[p]+dist(disc[l[p]],disc[l[i]]); 
		}
		if(l[i]<=r[i]){
			if(r[i]<m)update(1,1,m,r[i]+1,m,i); 
			if(l[i]>1)update(1,1,m,1,l[i]-1,i);
		}else{
			if(r[i]+1<=l[i]-1)update(1,1,m,r[i]+1,l[i]-1,i); 
		}
		//cout<<f[i]<<endl;
	}
	ll ans=oo; 
	rep(i,1,n){
		int p;
		p=query(1,1,m,l[i]); 
		//cout<<p<<endl;
		if(p==n+1)ans=0; 
		else ans=min(ans,f[p]+dist(disc[l[p]],disc[l[i]])); 
		p=query(1,1,m,r[i]); 
		//cout<<p<<endl;
		if(p==n+1)ans=0; 
		else ans=min(ans,f[p]+dist(disc[l[p]],disc[r[i]])); 
		//cout<<ans<<endl;
	}
	//printf("%lld\n",ans); 
	rep(i,1,n)ans+=a[i]<<1;
	printf("%lld\n", ans);
	return 0; 
}
### Prompt

Your task is to create a cpp solution to the following problem:

There is a railroad in Takahashi Kingdom. The railroad consists of N sections, numbered 1, 2, ..., N, and N+1 stations, numbered 0, 1, ..., N. Section i directly connects the stations i-1 and i. A train takes exactly A_i minutes to run through section i, regardless of direction. Each of the N sections is either single-tracked over the whole length, or double-tracked over the whole length. If B_i = 1, section i is single-tracked; if B_i = 2, section i is double-tracked. Two trains running in opposite directions can cross each other on a double-tracked section, but not on a single-tracked section. Trains can also cross each other at a station.

Snuke is creating the timetable for this railroad. In this timetable, the trains on the railroad run every K minutes, as shown in the following figure. Here, bold lines represent the positions of trains running on the railroad. (See Sample 1 for clarification.)

<image>

When creating such a timetable, find the minimum sum of the amount of time required for a train to depart station 0 and reach station N, and the amount of time required for a train to depart station N and reach station 0. It can be proved that, if there exists a timetable satisfying the conditions in this problem, this minimum sum is always an integer.

Formally, the times at which trains arrive and depart must satisfy the following:

* Each train either departs station 0 and is bound for station N, or departs station N and is bound for station 0.
* Each train takes exactly A_i minutes to run through section i. For example, if a train bound for station N departs station i-1 at time t, the train arrives at station i exactly at time t+A_i.
* Assume that a train bound for station N arrives at a station at time s, and departs the station at time t. Then, the next train bound for station N arrives at the station at time s+K, and departs the station at time t+K. Additionally, the previous train bound for station N arrives at the station at time s-K, and departs the station at time t-K. This must also be true for trains bound for station 0.
* Trains running in opposite directions must not be running on the same single-tracked section (except the stations at both ends) at the same time.

Constraints

* 1 \leq N \leq 100000
* 1 \leq K \leq 10^9
* 1 \leq A_i \leq 10^9
* A_i is an integer.
* B_i is either 1 or 2.

Input

The input is given from Standard Input in the following format:


N K
A_1 B_1
A_2 B_2
:
A_N B_N


Output

Print an integer representing the minimum sum of the amount of time required for a train to depart station 0 and reach station N, and the amount of time required for a train to depart station N and reach station 0. If it is impossible to create a timetable satisfying the conditions, print -1 instead.

Examples

Input

3 10
4 1
3 1
4 1


Output

26


Input

1 10
10 1


Output

-1


Input

6 4
1 1
1 1
1 1
1 1
1 1
1 1


Output

12


Input

20 987654321
129662684 2
162021979 1
458437539 1
319670097 2
202863355 1
112218745 1
348732033 1
323036578 1
382398703 1
55854389 1
283445191 1
151300613 1
693338042 2
191178308 2
386707193 1
204580036 1
335134457 1
122253639 1
824646518 2
902554792 2


Output

14829091348

### Response

```cpp
#include <bits/stdc++.h>
#define pb push_back
#define all(x) x.begin(),x.end()
#define cmin(a,b) (a>b?a=b:a)
#define cmax(a,b) (a<b?a=b:a)
#define lop(i,s,t) for(int i=s;i<(t);++i)
#define rep(i,s,t) for(int i=s;i<=(t);++i)
#define dec(i,s,t) for(int i=s;i>=(t);--i)
#define fore(i,v) for(int i=g[v],d=es[i].d;i;i=es[i].nxt,d=es[i].d)
using namespace std;
 
#define Pr(f,...) printf(f,##__VA_ARGS__),fflush(stdout)

typedef int inte;
typedef long long ll;
#define int ll

const int N=4e5+50; 
const ll oo=1e18; 


int tr[N<<1]; 
void build(int v,int l,int r,int x){
	if(l==r)tr[v]=x; 
	else{
		int mid=(l+r)>>1;
		tr[v]=x;
		build(v<<1,l,mid,x); 
		build(v<<1^1,mid+1,r,x); 
	}
}

void update(int v,int l,int r,int s,int t,int x){
	if(r<s||l>t);
	else if(s<=l&&r<=t)cmin(tr[v],x); 
	else{
		int mid=(l+r)>>1;
		update(v<<1,l,mid,s,t,x);
		update(v<<1^1,mid+1,r,s,t,x); 
	}
}
int query(int v,int l,int r,int p){
	if(l==r)return tr[v]; 
	else{
		int mid=(l+r)>>1;
		if(p<=mid)return min(tr[v],query(v<<1,l,mid,p));
		else return min(tr[v],query(v<<1^1,mid+1,r,p)); 
	}
}

int n,m,k,a[N],b[N],disc[N],l[N],r[N];
ll f[N],sum[N];
int dist(int x,int y){ return (x-y+k)%k; }

inte main(inte argc,char *argv[]){
#ifdef CURIOUSCAT
	freopen("dat.in","r",stdin); 
	//freopen("my.out","w",stdout); 
#endif
	scanf("%lld%lld",&n,&k); 
	rep(i,1,n){
		scanf("%lld%lld",a+i,b+i); 
		if(b[i]==1&&a[i]*2>k){
			puts("-1"); 
			return 0; 
		}
		sum[i]=sum[i-1]-2ll*a[i]; 
		sum[i]=(sum[i]%k+k)%k; 
		//cout<<sum[i]<<endl;
	}
	rep(i,1,n){
		if(b[i]==2){
			l[i]=0,r[i]=k-1; 
		}else{
			l[i]=sum[i-1],r[i]=sum[i]; 
		}
		disc[++m]=l[i]; 
		disc[++m]=r[i]; 
	}
	//for(int i=1;i<=m;++i)printf("F:%lld\n",disc[i]); 
	sort(disc+1,disc+m+1); 
	m=unique(disc+1,disc+m+1)-disc-1; 
	//printf("%lld,%lld\n",disc[1],disc[m]); 
	rep(i,1,n){
		l[i]=lower_bound(disc+1,disc+m+1,l[i])-disc;
		r[i]=lower_bound(disc+1,disc+m+1,r[i])-disc;
		//printf("%lld,%lld\n",l[i],r[i]); 
	}
	build(1,1,m,n+1); 
	dec(i,n,1){
		int p=query(1,1,m,l[i]); 
		if(p!=n+1){
			f[i]=f[p]+dist(disc[l[p]],disc[l[i]]); 
		}
		if(l[i]<=r[i]){
			if(r[i]<m)update(1,1,m,r[i]+1,m,i); 
			if(l[i]>1)update(1,1,m,1,l[i]-1,i);
		}else{
			if(r[i]+1<=l[i]-1)update(1,1,m,r[i]+1,l[i]-1,i); 
		}
		//cout<<f[i]<<endl;
	}
	ll ans=oo; 
	rep(i,1,n){
		int p;
		p=query(1,1,m,l[i]); 
		//cout<<p<<endl;
		if(p==n+1)ans=0; 
		else ans=min(ans,f[p]+dist(disc[l[p]],disc[l[i]])); 
		p=query(1,1,m,r[i]); 
		//cout<<p<<endl;
		if(p==n+1)ans=0; 
		else ans=min(ans,f[p]+dist(disc[l[p]],disc[r[i]])); 
		//cout<<ans<<endl;
	}
	//printf("%lld\n",ans); 
	rep(i,1,n)ans+=a[i]<<1;
	printf("%lld\n", ans);
	return 0; 
}
```