#include<bits/stdc++.h>
#define IL inline
#define _ 400005
#define ll long long
using namespace std ;
 
IL int gi(){
    int data = 0 , m = 1; char ch = 0;
    while(ch!='-' && (ch<'0'||ch>'9')) ch = getchar();
    if(ch == '-'){m = 0 ; ch = getchar() ; }
    while(ch >= '0' && ch <= '9'){data = (data<<1) + (data<<3) + (ch^48) ; ch = getchar(); }
    return (m) ? data : -data ; 
}
 
#define inf 2e18
 
int seqL[_] , seqR[_] , n , K , cov[_ << 2] , A[_] , B[_] , X[_] , xox , nL ;
ll Ans  , f[_] , SUM ; 

IL void PushDown(int o) {
	if(!cov[o]) return ;
	cov[o << 1] = cov[o] ; cov[o << 1 | 1] = cov[o] ; cov[o] = 0 ; return ;
}
void Insert(int o , int l , int r , int ql , int qr , int v) {
	if(ql > qr) return ;
	if(ql <= l && r <= qr) {cov[o] = v ; return ; }
	int mid = (l + r) >> 1 ;
	PushDown(o) ;
	if(ql <= mid) Insert(o << 1 , l , mid , ql , qr , v) ;
	if(qr  > mid) Insert(o << 1 | 1 , mid + 1 , r , ql , qr , v) ;
	return ; 	
}
int Query(int o , int l , int r , int ps) {
	if(l == r) return cov[o] ;
	int mid = (l + r) >> 1 ; PushDown(o) ;
	return ps <= mid ? Query(o << 1 , l , mid , ps) : Query(o << 1 | 1 , mid + 1 , r , ps) ;
}
 
IL void Init() {
	n = gi() ; K = gi() ;
	for(int i = 1; i <= n; i ++) A[i] = gi() , B[i] = gi() ;
	for(int i = 1; i <= n; i ++) if(2 * A[i] > K && B[i] == 1) {puts("-1") ; exit(0) ; } 
	for(int i = 1; i <= n; i ++) SUM += A[i] , A[i] = (A[i] + A[i - 1]) % K  ;
	nL = 0 ;
	for(int i = 1; i <= n; i ++)
		if(B[i] == 1) {
			seqL[i] = ((-2 * A[i - 1]) % K + K) % K ;
			seqR[i] = ((-2 * A[i]) % K + K) % K ; 
		}
		else seqL[i] = 0 , seqR[i] = K - 1 ; 
	for(int i = 1; i <= n; i ++) X[++xox] = seqL[i] , X[++xox] = seqR[i] ;
	sort(X + 1 , X + xox + 1) ; xox = unique(X + 1 , X + xox + 1) - X - 1 ;
	for(int i = 1; i <= n; i ++) {
		seqL[i] = lower_bound(X + 1 , X + xox + 1 , seqL[i]) - X ;
		seqR[i] = lower_bound(X + 1 , X + xox + 1 , seqR[i]) - X ; 
	}
	return ;
}
 
IL int Dist(int u , int v) {if(v >= u) return v - u ; else return v + K - u ; }
 
int main() {
	Init() ; 
	f[n + 1] = 0 ;
	seqL[n + 1] = seqL[n] ; 
	Insert(1 , 1 , xox , 1 , xox , n + 1) ;
	for(int i = n,v; i >= 1; i --) {
		f[i] = f[v = Query(1 , 1 , xox , seqL[i])] + 1ll * (v <= n) * Dist(X[seqL[i]] , X[seqL[v]]) ;
		if(seqL[i] > seqR[i])  Insert(1 , 1 , xox , seqR[i] + 1 , seqL[i] - 1 , i) ;
		else {
			Insert(1 , 1 , xox , 1 , seqL[i] - 1 , i) ;
			Insert(1 , 1 , xox , seqR[i] + 1 , xox , i) ; 
		} 
	}
	Ans = inf ;
	for(int i = 1,v; i <= xox; i ++) 
		Ans = min(Ans , f[v = Query(1 , 1 , xox , i)] +  1ll * (v <= n) * Dist(X[i] , X[seqL[v]])) ;
	Ans = Ans + 2ll * SUM ;
	cout << Ans << endl ; return 0 ; 
}

### Prompt

Create a solution in CPP for 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 IL inline
#define _ 400005
#define ll long long
using namespace std ;
 
IL int gi(){
    int data = 0 , m = 1; char ch = 0;
    while(ch!='-' && (ch<'0'||ch>'9')) ch = getchar();
    if(ch == '-'){m = 0 ; ch = getchar() ; }
    while(ch >= '0' && ch <= '9'){data = (data<<1) + (data<<3) + (ch^48) ; ch = getchar(); }
    return (m) ? data : -data ; 
}
 
#define inf 2e18
 
int seqL[_] , seqR[_] , n , K , cov[_ << 2] , A[_] , B[_] , X[_] , xox , nL ;
ll Ans  , f[_] , SUM ; 

IL void PushDown(int o) {
	if(!cov[o]) return ;
	cov[o << 1] = cov[o] ; cov[o << 1 | 1] = cov[o] ; cov[o] = 0 ; return ;
}
void Insert(int o , int l , int r , int ql , int qr , int v) {
	if(ql > qr) return ;
	if(ql <= l && r <= qr) {cov[o] = v ; return ; }
	int mid = (l + r) >> 1 ;
	PushDown(o) ;
	if(ql <= mid) Insert(o << 1 , l , mid , ql , qr , v) ;
	if(qr  > mid) Insert(o << 1 | 1 , mid + 1 , r , ql , qr , v) ;
	return ; 	
}
int Query(int o , int l , int r , int ps) {
	if(l == r) return cov[o] ;
	int mid = (l + r) >> 1 ; PushDown(o) ;
	return ps <= mid ? Query(o << 1 , l , mid , ps) : Query(o << 1 | 1 , mid + 1 , r , ps) ;
}
 
IL void Init() {
	n = gi() ; K = gi() ;
	for(int i = 1; i <= n; i ++) A[i] = gi() , B[i] = gi() ;
	for(int i = 1; i <= n; i ++) if(2 * A[i] > K && B[i] == 1) {puts("-1") ; exit(0) ; } 
	for(int i = 1; i <= n; i ++) SUM += A[i] , A[i] = (A[i] + A[i - 1]) % K  ;
	nL = 0 ;
	for(int i = 1; i <= n; i ++)
		if(B[i] == 1) {
			seqL[i] = ((-2 * A[i - 1]) % K + K) % K ;
			seqR[i] = ((-2 * A[i]) % K + K) % K ; 
		}
		else seqL[i] = 0 , seqR[i] = K - 1 ; 
	for(int i = 1; i <= n; i ++) X[++xox] = seqL[i] , X[++xox] = seqR[i] ;
	sort(X + 1 , X + xox + 1) ; xox = unique(X + 1 , X + xox + 1) - X - 1 ;
	for(int i = 1; i <= n; i ++) {
		seqL[i] = lower_bound(X + 1 , X + xox + 1 , seqL[i]) - X ;
		seqR[i] = lower_bound(X + 1 , X + xox + 1 , seqR[i]) - X ; 
	}
	return ;
}
 
IL int Dist(int u , int v) {if(v >= u) return v - u ; else return v + K - u ; }
 
int main() {
	Init() ; 
	f[n + 1] = 0 ;
	seqL[n + 1] = seqL[n] ; 
	Insert(1 , 1 , xox , 1 , xox , n + 1) ;
	for(int i = n,v; i >= 1; i --) {
		f[i] = f[v = Query(1 , 1 , xox , seqL[i])] + 1ll * (v <= n) * Dist(X[seqL[i]] , X[seqL[v]]) ;
		if(seqL[i] > seqR[i])  Insert(1 , 1 , xox , seqR[i] + 1 , seqL[i] - 1 , i) ;
		else {
			Insert(1 , 1 , xox , 1 , seqL[i] - 1 , i) ;
			Insert(1 , 1 , xox , seqR[i] + 1 , xox , i) ; 
		} 
	}
	Ans = inf ;
	for(int i = 1,v; i <= xox; i ++) 
		Ans = min(Ans , f[v = Query(1 , 1 , xox , i)] +  1ll * (v <= n) * Dist(X[i] , X[seqL[v]])) ;
	Ans = Ans + 2ll * SUM ;
	cout << Ans << endl ; return 0 ; 
}

```