#include using namespace std; #include using namespace atcoder; using ll = int64_t; using mint = modint1000000007; int H, W; vector A, B; void input() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> H >> W; assert(H >= 1 && H <= 100000); assert(W >= 1 && W <= 100000); A.resize(H); for (ll i=0; i> A[i]; assert(A[i] >= 0 && A[i] <= 1000000000); } B.resize(W); for (ll j=0; j> B[j]; assert(B[j] >= 0 && B[j] <= 1000000000); } // 積み重ね方が存在する条件は max(A)=max(B) assert(*max_element(A.begin(), A.end()) == *max_element(B.begin(), B.end())); } void solve_min() { unordered_map a, b; unordered_set unique; for (ll i=0; i a(H), b(W); ll ia = 0, ib = 0; while (ia < H || ib < W) { if (A[ia] <= B[ib]) { b[ib] = ia; ++ib; } else { a[ia] = ib; ++ia; } } mint ans = 0; for (ll i=0; i