#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define Debug(...) fprintf(stderr, __VA_ARGS__)

typedef long long LL;
typedef long double LD;
typedef unsigned int uint;
typedef pair <int, int> pii;
typedef unsigned long long uLL;

template <typename T> inline void Read(T &x) {
  char c = getchar();
  bool f = false;
  for (x = 0; !isdigit(c); c = getchar()) {
    if (c == '-') {
      f = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (f) {
    x = -x;
  }
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}

const int N = 200005;
const LL inf = 1LL << 60;

int n, m, sum, tot, a[N], l[N], r[N], all[N], opt[N], val[N << 2];
LL ans, f[N], g[N];

inline void Build(int x, int l, int r, int v) {
  val[x] = v;
  if (l == r) {
    return ;
  }
  int mid = l + r >> 1;
  Build(x << 1, l, mid, v), Build(x << 1 | 1, mid + 1, r, v);
}

inline void ModifyMin(int x, int l, int r, int ql, int qr, int v) {
  if (l == ql && r == qr) {
    val[x] = v;
    return ;
  }
  int mid = l + r >> 1;
  if (qr <= mid) {
    ModifyMin(x << 1, l, mid, ql, qr, v);
  } else if (ql > mid) {
    ModifyMin(x << 1 | 1, mid + 1, r, ql, qr, v);
  } else {
    ModifyMin(x << 1, l, mid, ql, mid, v), ModifyMin(x << 1 | 1, mid + 1, r, mid + 1, qr, v);
  }
}

inline int QueryMin(int x, int l, int r, int p) {
  if (l == r) {
    return val[x];
  }
  int mid = l + r >> 1;
  if (p <= mid) {
    return min(val[x], QueryMin(x << 1, l, mid, p));
  } else {
    return min(val[x], QueryMin(x << 1 | 1, mid + 1, r, p));
  }
}

inline void ModifySum(int x, int l, int r, int ql, int qr) {
  if (l == ql && r == qr) {
    ++val[x];
    return ;
  }
  int mid = l + r >> 1;
  if (qr <= mid) {
    ModifySum(x << 1, l, mid, ql, qr);
  } else if (ql > mid) {
    ModifySum(x << 1 | 1, mid + 1, r, ql, qr);
  } else {
    ModifySum(x << 1, l, mid, ql, mid), ModifySum(x << 1 | 1, mid + 1, r, mid + 1, qr);
  }
}

inline int QuerySum(int x, int l, int r, int p) {
  if (l == r) {
    return val[x];
  }
  int mid = l + r >> 1;
  if (p <= mid) {
    return val[x] + QuerySum(x << 1, l, mid, p);
  } else {
    return val[x] + QuerySum(x << 1 | 1, mid + 1, r, p);
  }
}

int main() {
#ifdef wxh010910
  freopen("d.in", "r", stdin);
#endif
  Read(n), Read(m), ans = inf;
  for (int i = 1; i <= n; ++i) {
    Read(a[i]), Read(opt[i]);
    if (opt[i] == 1 && (a[i] << 1) > m) {
      puts("-1");
      return 0;
    }
    if (opt[i] == 2) {
      l[i] = 0, r[i] = m - 1;
    } else {
      l[i] = sum, r[i] = ((sum - 2 * a[i]) % m + m) % m;
    }
    sum = ((sum - 2 * a[i]) % m + m) % m;
    all[++tot] = l[i], all[++tot] = r[i], ans;
  }
  sort(all + 1, all + tot + 1), tot = unique(all + 1, all + tot + 1) - all - 1;
  for (int i = 1; i <= n; ++i) {
    l[i] = lower_bound(all + 1, all + tot + 1, l[i]) - all;
    r[i] = lower_bound(all + 1, all + tot + 1, r[i]) - all;
  }
  Build(1, 1, tot, n + 1);
  for (int i = n, p; i; --i) {
    p = QueryMin(1, 1, tot, l[i]);
    if (p != n + 1) {
      f[i] = f[p] + (all[l[p]] - all[l[i]] + m) % m;
    }
    p = QueryMin(1, 1, tot, r[i]);
    if (p != n + 1) {
      g[i] = f[p] + (all[l[p]] - all[r[i]] + m) % m;
    }
    if (l[i] <= r[i]) {
      if (r[i] < tot) {
        ModifyMin(1, 1, tot, r[i] + 1, tot, i);
      }
      if (l[i] > 1) {
        ModifyMin(1, 1, tot, 1, l[i] - 1, i);
      }
    } else {
      if (r[i] + 1 < l[i]) {
        ModifyMin(1, 1, tot, r[i] + 1, l[i] - 1, i);
      }
    }
  }
  Build(1, 1, tot, 0);
  for (int i = 1; i <= n; ++i) {
    if (QuerySum(1, 1, tot, l[i]) == i - 1) {
      CheckMin(ans, f[i]);
    }
    if (QuerySum(1, 1, tot, r[i]) == i - 1) {
      CheckMin(ans, g[i]);
    }
    if (l[i] <= r[i]) {
      ModifySum(1, 1, tot, l[i], r[i]);
    } else {
      ModifySum(1, 1, tot, 1, r[i]), ModifySum(1, 1, tot, l[i], tot);
    }
  }
  for (int i = 1; i <= n; ++i) {
    ans += a[i] << 1;
  }
  printf("%lld\n", ans);
#ifdef wxh010910
  Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
  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>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define Debug(...) fprintf(stderr, __VA_ARGS__)

typedef long long LL;
typedef long double LD;
typedef unsigned int uint;
typedef pair <int, int> pii;
typedef unsigned long long uLL;

template <typename T> inline void Read(T &x) {
  char c = getchar();
  bool f = false;
  for (x = 0; !isdigit(c); c = getchar()) {
    if (c == '-') {
      f = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (f) {
    x = -x;
  }
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}

const int N = 200005;
const LL inf = 1LL << 60;

int n, m, sum, tot, a[N], l[N], r[N], all[N], opt[N], val[N << 2];
LL ans, f[N], g[N];

inline void Build(int x, int l, int r, int v) {
  val[x] = v;
  if (l == r) {
    return ;
  }
  int mid = l + r >> 1;
  Build(x << 1, l, mid, v), Build(x << 1 | 1, mid + 1, r, v);
}

inline void ModifyMin(int x, int l, int r, int ql, int qr, int v) {
  if (l == ql && r == qr) {
    val[x] = v;
    return ;
  }
  int mid = l + r >> 1;
  if (qr <= mid) {
    ModifyMin(x << 1, l, mid, ql, qr, v);
  } else if (ql > mid) {
    ModifyMin(x << 1 | 1, mid + 1, r, ql, qr, v);
  } else {
    ModifyMin(x << 1, l, mid, ql, mid, v), ModifyMin(x << 1 | 1, mid + 1, r, mid + 1, qr, v);
  }
}

inline int QueryMin(int x, int l, int r, int p) {
  if (l == r) {
    return val[x];
  }
  int mid = l + r >> 1;
  if (p <= mid) {
    return min(val[x], QueryMin(x << 1, l, mid, p));
  } else {
    return min(val[x], QueryMin(x << 1 | 1, mid + 1, r, p));
  }
}

inline void ModifySum(int x, int l, int r, int ql, int qr) {
  if (l == ql && r == qr) {
    ++val[x];
    return ;
  }
  int mid = l + r >> 1;
  if (qr <= mid) {
    ModifySum(x << 1, l, mid, ql, qr);
  } else if (ql > mid) {
    ModifySum(x << 1 | 1, mid + 1, r, ql, qr);
  } else {
    ModifySum(x << 1, l, mid, ql, mid), ModifySum(x << 1 | 1, mid + 1, r, mid + 1, qr);
  }
}

inline int QuerySum(int x, int l, int r, int p) {
  if (l == r) {
    return val[x];
  }
  int mid = l + r >> 1;
  if (p <= mid) {
    return val[x] + QuerySum(x << 1, l, mid, p);
  } else {
    return val[x] + QuerySum(x << 1 | 1, mid + 1, r, p);
  }
}

int main() {
#ifdef wxh010910
  freopen("d.in", "r", stdin);
#endif
  Read(n), Read(m), ans = inf;
  for (int i = 1; i <= n; ++i) {
    Read(a[i]), Read(opt[i]);
    if (opt[i] == 1 && (a[i] << 1) > m) {
      puts("-1");
      return 0;
    }
    if (opt[i] == 2) {
      l[i] = 0, r[i] = m - 1;
    } else {
      l[i] = sum, r[i] = ((sum - 2 * a[i]) % m + m) % m;
    }
    sum = ((sum - 2 * a[i]) % m + m) % m;
    all[++tot] = l[i], all[++tot] = r[i], ans;
  }
  sort(all + 1, all + tot + 1), tot = unique(all + 1, all + tot + 1) - all - 1;
  for (int i = 1; i <= n; ++i) {
    l[i] = lower_bound(all + 1, all + tot + 1, l[i]) - all;
    r[i] = lower_bound(all + 1, all + tot + 1, r[i]) - all;
  }
  Build(1, 1, tot, n + 1);
  for (int i = n, p; i; --i) {
    p = QueryMin(1, 1, tot, l[i]);
    if (p != n + 1) {
      f[i] = f[p] + (all[l[p]] - all[l[i]] + m) % m;
    }
    p = QueryMin(1, 1, tot, r[i]);
    if (p != n + 1) {
      g[i] = f[p] + (all[l[p]] - all[r[i]] + m) % m;
    }
    if (l[i] <= r[i]) {
      if (r[i] < tot) {
        ModifyMin(1, 1, tot, r[i] + 1, tot, i);
      }
      if (l[i] > 1) {
        ModifyMin(1, 1, tot, 1, l[i] - 1, i);
      }
    } else {
      if (r[i] + 1 < l[i]) {
        ModifyMin(1, 1, tot, r[i] + 1, l[i] - 1, i);
      }
    }
  }
  Build(1, 1, tot, 0);
  for (int i = 1; i <= n; ++i) {
    if (QuerySum(1, 1, tot, l[i]) == i - 1) {
      CheckMin(ans, f[i]);
    }
    if (QuerySum(1, 1, tot, r[i]) == i - 1) {
      CheckMin(ans, g[i]);
    }
    if (l[i] <= r[i]) {
      ModifySum(1, 1, tot, l[i], r[i]);
    } else {
      ModifySum(1, 1, tot, 1, r[i]), ModifySum(1, 1, tot, l[i], tot);
    }
  }
  for (int i = 1; i <= n; ++i) {
    ans += a[i] << 1;
  }
  printf("%lld\n", ans);
#ifdef wxh010910
  Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
  return 0;
}

```