#include <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<ctime>
#include<set>
#include<map>
#include<queue>
#include<stack>
#define sqr(x) ((x)*(x))
#define fz1(i,n) for ((i)=1;(i)<=(n);(i)++)
#define fd1(i,n) for ((i)=(n);(i)>=1;(i)--)
#define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
#define fd0g(i,n) for ((i)=(n);(i)>=0;(i)--)
#define fz0k(i,n) for ((i)=0;(i)<(n);(i)++)
#define fd0k(i,n) for ((i)=(long long)((n)-1);(i)>=0;(i)--)
#define fz(i,x,y) for ((i)=(x);(i)<=(y);(i)++)
#define fd(i,y,x) for ((i)=(y);(i)>=(x);(i)--)
#define fzin fz1(i,n)
#define fzim fz1(i,m)
#define fzjn fz1(j,n)
#define fzjm fz1(j,m)
#define ff(c,itr) for (__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define rdst(st,len){static char ss[len];scanf(" %s",ss);(st)=ss;}
#define inc(x,y) {x+=(y);if(x>=mod)x-=mod;}
#define dec(x,y) {x-=(y);if(x<0)x+=mod;}
#define spln(i,n) (i==n?'\n':' ')
using namespace std;
long long n,k,i,j,a[100005],b[100005],l[100005],r[100005],dp[100005],tag[800005],sum;
vector<long long> all;
void upd(long long x,long long y)
{
	tag[x]=y;
}
void pushdo(long long x)
{
	if(tag[x]){
		upd(x+x,tag[x]);
		upd(x+x+1,tag[x]);
		tag[x]=0;
	}
}
void update(long long x,long long l,long long r,long long ql,long long qr,long long c)
{
	if(ql>qr)return;
	if(ql<=l&&r<=qr){
		upd(x,c);
		return;
	}
	long long mid=(l+r)/2;
	pushdo(x);
	if(ql<=mid) update(x+x,l,mid,ql,qr,c);
	if(qr>mid) update(x+x+1,mid+1,r,ql,qr,c);
}
long long query(long long x,long long l,long long r,long long y)
{
	if(l==r) return tag[x];
	long long mid=(l+r)/2;
	pushdo(x);
	if(y<=mid) return query(x+x,l,mid,y); else return query(x+x+1,mid+1,r,y);
}
long long fwd(long long x,long long y)
{
	return (all[y-1]+k-all[x-1])%k;
}
int main()
{
	scanf("%lld%lld",&n,&k);
	fz1(i,n){
		scanf("%lld%lld",&a[i],&b[i]);
		if(b[i]==1&&a[i]+a[i]>k){
			puts("-1");
			return 0;
		}
		sum+=a[i];
		a[i]=a[i]+a[i-1];a[i]%=k;
	}
	fz1(i,n){
		if(b[i]==1){
			l[i]=2*(k-a[i-1])%k;
			r[i]=2*(k-a[i])%k;
		}
		else{
			l[i]=0;
			r[i]=k-1;
		}
		all.push_back(l[i]);
		all.push_back(r[i]);
	}
	sort(all.begin(),all.end());
	all.resize(unique(all.begin(),all.end())-all.begin());
	fz1(i,n){
		l[i]=upper_bound(all.begin(),all.end(),l[i])-all.begin();
		r[i]=upper_bound(all.begin(),all.end(),r[i])-all.begin();
	}
	fd1(i,n){
		long long lst=query(1,1,all.size(),l[i]);
		if(!lst){
			dp[i]=0;
		}
		else{
			dp[i]=dp[lst]+fwd(l[i],l[lst]);
		}
		if(r[i]<l[i]){
			update(1,1,all.size(),r[i]+1,l[i]-1,i);
		}
		else{
			update(1,1,all.size(),1,l[i]-1,i);
			update(1,1,all.size(),r[i]+1,all.size(),i);
		}
	}
	long long ans=dp[1];
	fz1(i,all.size()){
		long long lst=query(1,1,all.size(),i);
		if(!lst) ans=0; else ans=min(ans,dp[lst]+fwd(i,l[lst]));
	}
	cout<<ans+sum*2<<endl;
	return 0;
}
### Prompt

Develop a solution in CPP to the problem described below:

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 <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<ctime>
#include<set>
#include<map>
#include<queue>
#include<stack>
#define sqr(x) ((x)*(x))
#define fz1(i,n) for ((i)=1;(i)<=(n);(i)++)
#define fd1(i,n) for ((i)=(n);(i)>=1;(i)--)
#define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
#define fd0g(i,n) for ((i)=(n);(i)>=0;(i)--)
#define fz0k(i,n) for ((i)=0;(i)<(n);(i)++)
#define fd0k(i,n) for ((i)=(long long)((n)-1);(i)>=0;(i)--)
#define fz(i,x,y) for ((i)=(x);(i)<=(y);(i)++)
#define fd(i,y,x) for ((i)=(y);(i)>=(x);(i)--)
#define fzin fz1(i,n)
#define fzim fz1(i,m)
#define fzjn fz1(j,n)
#define fzjm fz1(j,m)
#define ff(c,itr) for (__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define rdst(st,len){static char ss[len];scanf(" %s",ss);(st)=ss;}
#define inc(x,y) {x+=(y);if(x>=mod)x-=mod;}
#define dec(x,y) {x-=(y);if(x<0)x+=mod;}
#define spln(i,n) (i==n?'\n':' ')
using namespace std;
long long n,k,i,j,a[100005],b[100005],l[100005],r[100005],dp[100005],tag[800005],sum;
vector<long long> all;
void upd(long long x,long long y)
{
	tag[x]=y;
}
void pushdo(long long x)
{
	if(tag[x]){
		upd(x+x,tag[x]);
		upd(x+x+1,tag[x]);
		tag[x]=0;
	}
}
void update(long long x,long long l,long long r,long long ql,long long qr,long long c)
{
	if(ql>qr)return;
	if(ql<=l&&r<=qr){
		upd(x,c);
		return;
	}
	long long mid=(l+r)/2;
	pushdo(x);
	if(ql<=mid) update(x+x,l,mid,ql,qr,c);
	if(qr>mid) update(x+x+1,mid+1,r,ql,qr,c);
}
long long query(long long x,long long l,long long r,long long y)
{
	if(l==r) return tag[x];
	long long mid=(l+r)/2;
	pushdo(x);
	if(y<=mid) return query(x+x,l,mid,y); else return query(x+x+1,mid+1,r,y);
}
long long fwd(long long x,long long y)
{
	return (all[y-1]+k-all[x-1])%k;
}
int main()
{
	scanf("%lld%lld",&n,&k);
	fz1(i,n){
		scanf("%lld%lld",&a[i],&b[i]);
		if(b[i]==1&&a[i]+a[i]>k){
			puts("-1");
			return 0;
		}
		sum+=a[i];
		a[i]=a[i]+a[i-1];a[i]%=k;
	}
	fz1(i,n){
		if(b[i]==1){
			l[i]=2*(k-a[i-1])%k;
			r[i]=2*(k-a[i])%k;
		}
		else{
			l[i]=0;
			r[i]=k-1;
		}
		all.push_back(l[i]);
		all.push_back(r[i]);
	}
	sort(all.begin(),all.end());
	all.resize(unique(all.begin(),all.end())-all.begin());
	fz1(i,n){
		l[i]=upper_bound(all.begin(),all.end(),l[i])-all.begin();
		r[i]=upper_bound(all.begin(),all.end(),r[i])-all.begin();
	}
	fd1(i,n){
		long long lst=query(1,1,all.size(),l[i]);
		if(!lst){
			dp[i]=0;
		}
		else{
			dp[i]=dp[lst]+fwd(l[i],l[lst]);
		}
		if(r[i]<l[i]){
			update(1,1,all.size(),r[i]+1,l[i]-1,i);
		}
		else{
			update(1,1,all.size(),1,l[i]-1,i);
			update(1,1,all.size(),r[i]+1,all.size(),i);
		}
	}
	long long ans=dp[1];
	fz1(i,all.size()){
		long long lst=query(1,1,all.size(),i);
		if(!lst) ans=0; else ans=min(ans,dp[lst]+fwd(i,l[lst]));
	}
	cout<<ans+sum*2<<endl;
	return 0;
}
```