#include #define fi first #define se second #define rep(i,s,n) for (int i = (s); i < (n); ++i) #define rrep(i,g,n) for (int i = (n)-1; i >= (g); --i) #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define len(x) (int)(x).size() #define dup(x,y) (((x)+(y)-1)/(y)) #define pb push_back #define eb emplace_back #define Field(T) vector> using namespace std; using ll = long long; using ull = unsigned long long; template using pq = priority_queue,greater>; using P = pair; templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b a, vector b) { ll ret = 1000000000; int mx = *max_element(all(b)); rep(k,0,mx+1) { ll val = k; rep(i,0,n) val += 1LL*a[i]*dup(max(b[i]-k, 0LL), d); ret = min(ret, val); } cout << ret << endl; } int main() { int n; ll d; cin >> n >> d; map mp; rep(i,0,n) { ll a, b; cin >> a >> b; mp[b] += a; } vector a, b; for (auto [v, cnt] : mp) { a.eb(cnt), b.eb(v); } n = len(a); // jikken(n, d, a, b); reverse(all(a)), reverse(all(b)); // rep(i,0,n) cout << a[i] << " " << b[i] << endl; ll s = 0, m = n; ll ans = 0; rep(i,0,n) { if (s+a[i] <= d) s += a[i]; else { ans = b[i]; rep(j,0,i) { b[j] -= b[i]; } m = i; break; } } // cout << m << endl; if (m == 0) { cout << ans << endl; return 0; } // rep(i,0,m) { // cout << a[i] << " " << b[i] << endl; // } vector vals = {0, d-1}; rep(i,0,m) { vals.eb(b[i]%d); } sort(all(vals)); vals.erase(unique(all(vals)), vals.end()); int l = len(vals); vector imos(l); rep(i,0,m) { int idx = lower_bound(all(vals), b[i]%d)-vals.begin(); imos[0] += a[i]*dup(b[i], d); imos[idx] -= a[i]; } rep(i,0,l-1) imos[i+1] += imos[i]; rep(i,0,l) vals[i] += imos[i]; cout << ans+*min_element(all(vals)) << endl; // rep(k,0,d) { // ll val = k+ans; // rep(i,0,m) val += 1LL*a[i]*dup(max(b[i]-k, 0LL), d); // cout << val << " "; // } // cout << endl; return 0; }