#include #include using namespace std; using ll=int64_t; #define int ll #define FOR(i,a,b) for(int i=int(a);i CerrDummy& operator<<(CerrDummy&cd,const T&){ return cd; } using charTDummy=char; using traitsDummy=char_traits; CerrDummy& operator<<(CerrDummy&cd,basic_ostream&(basic_ostream&)){ return cd; } #define cerr cerrDummy #endif #define REACH cerr<<"reached"<; using vi=vector; using ld=long double; template ostream& operator<<(ostream& os,const pair& p){ os<<"("< ostream& operator <<(ostream& os,const vector& v){ os<<"{"; REP(i,(int)v.size()){ if(i)os<<","; os< void print_tuple(ostream&,const T&){ } template void print_tuple(ostream&os,const T&t){ if(i)os<<","; os<(t); print_tuple(os,t); } template ostream& operator<<(ostream&os,const tuple&t){ os<<"("; print_tuple<0,tuple,Args...>(os,t); return os<<")"; } ll read(){ ll i; scanf("%" SCNd64,&i); return i; } void printSpace(){ printf(" "); } void printEoln(){ printf("\n"); } void print(ll x,int suc=1){ printf("%" PRId64,x); if(suc==1) printEoln(); if(suc==2) printSpace(); } template void print(const vector&v){ REP(i,v.size()) print(v[i],i==int(v.size())-1?1:2); } string readString(){ static char buf[3341000]; scanf("%s",buf); return string(buf); } char* readCharArray(){ static char buf[3341000]; static int bufUsed=0; char* ret=buf+bufUsed; scanf("%s",ret); bufUsed+=strlen(ret)+1; return ret; } template void chmax(T& a,U b){ if(a void chmin(T& a,U b){ if(b T Sq(const T& t){ return t*t; } #define CAPITAL void Yes(bool ex=true){ #ifdef CAPITAL cout<<"YES"< vector Uniqued(const vector&vv){ auto v(vv); sort(ALL(v)); v.erase(unique(ALL(v)),v.end()); return v; } template void MakeUniqued(vector&v){ sort(ALL(v)); v.erase(unique(ALL(v)),v.end()); } signed main(){ int n=read(),l=read(); set x,y; REP(i,n) x.insert(read()); REP(i,n) y.insert(read()); const auto FindLowerbound=[&](set&s,int v){ auto itr=s.lower_bound(v); if(itr!=s.end())return *itr; return *s.begin(); }; const auto FindPrev=[&](set&s,int v){ auto itr=s.lower_bound(v); if(itr!=s.begin())return *prev(itr); return *prev(s.end()); }; int cur=0,ans=0; REP(_,n){ int a=FindLowerbound(x,cur); ans+=(a-cur+l)%l; cur=a; int b=FindLowerbound(y,cur); int c=FindLowerbound(x,b); int d=FindPrev(y,c); x.erase(a); y.erase(d); ans+=(d-cur+l)%l; cur=d; } print(ans); }