#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE
vector<Int> gen(Int v0,Int vd,Int len,Int mod){
  vector<Int> vs(len);
  vs[0]=v0;
  for(Int i=0;i+1<len;i++)
    vs[i+1]=(vs[i]*58+vd)%(mod+1);
  return vs;
}

signed main(){
  Int m,n,m0,md,n0,nd;
  cin>>m>>n>>m0>>md>>n0>>nd;
  vector<Int> ms=gen(m0,md,m,n);
  vector<Int> ns=gen(n0,nd,n,m);
  if(0){
    for(Int i=0;i<m;i++) cout<<ms[i]<<" ";  
    cout<<endl;
    for(Int i=0;i<n;i++) cout<<ns[i]<<" ";
    cout<<endl;
  }

  Int ans=0;
  sort(ms.rbegin(),ms.rend());
  
  vector<Int> cnt(m+1,0);
  for(Int v:ns) cnt[v]++;
  cnt.erase(cnt.begin());

  Int sum=0;
  vector<Int> rev;

  for(Int x:ms){
    if(x==0) break;
    if(rev.empty()&&cnt.empty()) break;
    
    while(!cnt.empty()&&sum<x){
      rev.emplace_back(cnt.back());
      sum+=cnt.back();
      cnt.pop_back();      
    }
    while(!rev.empty()&&sum-rev.back()>=x){
      cnt.emplace_back(rev.back());
      sum-=rev.back();
      rev.pop_back();
    }
    
    Int res=min(sum,x);
    ans+=res;
    if(sum>=x){
      Int dif=sum-x;
      assert(!rev.empty());
      assert(rev.back()>=dif);

      if(rev.size()>=2u){
        rev[rev.size()-1]-=dif;
        rev[rev.size()-2]+=dif;
      }else{
        Int nxt=rev[0]-dif;
        rev[0]=dif;
        rev.emplace_back(nxt);
      }
      
      if(cnt.empty()){
        sum-=rev.back();
        rev.pop_back();
      }else{
        rev.back()+=cnt.back();
        sum+=cnt.back();
        cnt.pop_back();
      }
    }else{
      assert(cnt.empty());
      sum-=rev.back();
      rev.pop_back();
    }
  }
  
  cout<<ans<<endl;
  return 0;
}


### Prompt

Create a solution in cpp for the following problem:

Example

Input

2 3 1 3 1 0


Output

2

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}

//INSERT ABOVE HERE
vector<Int> gen(Int v0,Int vd,Int len,Int mod){
  vector<Int> vs(len);
  vs[0]=v0;
  for(Int i=0;i+1<len;i++)
    vs[i+1]=(vs[i]*58+vd)%(mod+1);
  return vs;
}

signed main(){
  Int m,n,m0,md,n0,nd;
  cin>>m>>n>>m0>>md>>n0>>nd;
  vector<Int> ms=gen(m0,md,m,n);
  vector<Int> ns=gen(n0,nd,n,m);
  if(0){
    for(Int i=0;i<m;i++) cout<<ms[i]<<" ";  
    cout<<endl;
    for(Int i=0;i<n;i++) cout<<ns[i]<<" ";
    cout<<endl;
  }

  Int ans=0;
  sort(ms.rbegin(),ms.rend());
  
  vector<Int> cnt(m+1,0);
  for(Int v:ns) cnt[v]++;
  cnt.erase(cnt.begin());

  Int sum=0;
  vector<Int> rev;

  for(Int x:ms){
    if(x==0) break;
    if(rev.empty()&&cnt.empty()) break;
    
    while(!cnt.empty()&&sum<x){
      rev.emplace_back(cnt.back());
      sum+=cnt.back();
      cnt.pop_back();      
    }
    while(!rev.empty()&&sum-rev.back()>=x){
      cnt.emplace_back(rev.back());
      sum-=rev.back();
      rev.pop_back();
    }
    
    Int res=min(sum,x);
    ans+=res;
    if(sum>=x){
      Int dif=sum-x;
      assert(!rev.empty());
      assert(rev.back()>=dif);

      if(rev.size()>=2u){
        rev[rev.size()-1]-=dif;
        rev[rev.size()-2]+=dif;
      }else{
        Int nxt=rev[0]-dif;
        rev[0]=dif;
        rev.emplace_back(nxt);
      }
      
      if(cnt.empty()){
        sum-=rev.back();
        rev.pop_back();
      }else{
        rev.back()+=cnt.back();
        sum+=cnt.back();
        cnt.pop_back();
      }
    }else{
      assert(cnt.empty());
      sum-=rev.back();
      rev.pop_back();
    }
  }
  
  cout<<ans<<endl;
  return 0;
}


```