#include #include #include #include #include using namespace std; struct dat{ long ALL,MIN; }; dat op(dat a,dat b) { a.MIN=min(a.MIN,a.ALL+b.MIN); a.ALL+=b.ALL; return a; } dat e(){return(dat){0L,0L};} int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N,D;cin>>N>>D; vectorvs; vs.reserve(N+2); vs.push_back(0); vs.push_back(D); vector >AB(N); __int128 cur=0; for(int i=0;i>A>>B; cur+=(B+D-1)/D*(long)A; vs.push_back(B%D); AB[i]=make_pair(A,B); } sort(vs.begin(),vs.end()); vs.erase(unique(vs.begin(),vs.end()),vs.end()); vectorinit(vs.size()-1,e()); for(int i=0;i0); init[i-1].ALL-=A; } for(dat&x:init)if(x.ALL<0)x.MIN=x.ALL; atcoder::segtreeseg(init); sort(AB.begin(),AB.end(),[](pairl,pairr){return l.second0); init[id-1].ALL+=AB[i++].first; init[id-1].MIN=min(0L,init[id-1].ALL); seg.set(id-1,init[id-1]); } ans=min(ans,cur+seg.all_prod().MIN); if(i