#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e6 + 5;
const int MOD = 1e9 + 7;
int add(int a, int b) {
return (a + b) % MOD;
}
int n;
int a[N];
int k[N];
void compress(int a[]) {
vector<int> vals;
for (int i = 1; i <= n; i++) vals.push_back(a[i]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin();
}
}
int seg[4 * N];
void update(int id, int l, int r, int pos, int val) {
if (l > pos || r < pos) return;
if (l == r) {
seg[id] += val;
return;
}
int mid = (l + r) >> 1;
update(id * 2, l, mid, pos, val);
update(id * 2 + 1, mid + 1, r, pos, val);
seg[id] = seg[id * 2] + seg[id * 2 + 1];
}
// Tìm i nhỏ nhất sao cho sum[1..i] >= k
int findKth(int id, int l, int r, int k) {
if (k > seg[id]) return n + 1;
if (l == r) return l;
int mid = (l + r) >> 1;
int res = findKth(id * 2, l, mid, k);
if (res == n + 1) res = findKth(id * 2 + 1, mid + 1, r, k - seg[id * 2]);
return res;
}
int last[N];
int nxt[N]; // nxt[l] = vị trí l' gần nhất > l sao cho a[l'] = a[l]
int first_r[N]; // first_r[l] = đầu mút r nhỏ nhất thoả mãn đoạn [l, r] có >= k[l] giá trị phân biệt
void precompute() {
for (int l = n; l >= 1; l--) {
nxt[l] = (last[a[l]] == 0) ? n + 1 : last[a[l]];
last[a[l]] = l;
}
for (int l = n; l >= 1; l--) {
if (nxt[l] <= n) update(1, 1, n, nxt[l], -1);
update(1, 1, n, l, 1);
first_r[l] = findKth(1, 1, n, k[l]);
}
}
int dp[N]; // dp[l] = có bao nhiêu cách phân rã đoạn [l, n]
int suf_dp[N]; // suf_dp[l] = tổng các dp[l], dp[l + 1],..., dp[n]
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> k[i];
compress(a);
precompute();
dp[n + 1] = suf_dp[n + 1] = 1;
for (int l = n; l >= 1; l--) {
dp[l] = add(dp[l], suf_dp[first_r[l] + 1]);
suf_dp[l] = add(suf_dp[l + 1], dp[l]);
}
cout << dp[1] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDFlNiArIDU7IApjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgIAoKaW50IGFkZChpbnQgYSwgaW50IGIpIHsKCXJldHVybiAoYSArIGIpICUgTU9EOyAKfQoKaW50IG47IAppbnQgYVtOXTsKaW50IGtbTl07IAoKdm9pZCBjb21wcmVzcyhpbnQgYVtdKSB7Cgl2ZWN0b3I8aW50PiB2YWxzOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgdmFscy5wdXNoX2JhY2soYVtpXSk7IAoJc29ydCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpOyAgIAoJdmFscy5yZXNpemUodW5pcXVlKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSkgLSB2YWxzLmJlZ2luKCkpOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWFbaV0gPSBsb3dlcl9ib3VuZCh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCksIGFbaV0pIC0gdmFscy5iZWdpbigpOyAKCX0KfQoKaW50IHNlZ1s0ICogTl07IAoKdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpIHsKCWlmIChsID4gcG9zIHx8IHIgPCBwb3MpIHJldHVybjsgIAoJaWYgKGwgPT0gcikgewoJCXNlZ1tpZF0gKz0gdmFsOyAgCgkJcmV0dXJuOyAKCX0KCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoJdXBkYXRlKGlkICogMiwgbCwgbWlkLCBwb3MsIHZhbCk7IAoJdXBkYXRlKGlkICogMiArIDEsIG1pZCArIDEsIHIsIHBvcywgdmFsKTsgCglzZWdbaWRdID0gc2VnW2lkICogMl0gKyBzZWdbaWQgKiAyICsgMV07IAp9CgovLyBUw6xtIGkgbmjhu48gbmjhuqV0IHNhbyBjaG8gc3VtWzEuLmldID49IGsKaW50IGZpbmRLdGgoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBrKSB7CglpZiAoayA+IHNlZ1tpZF0pIHJldHVybiBuICsgMTsgIAoJaWYgKGwgPT0gcikgcmV0dXJuIGw7ICAKCWludCBtaWQgPSAobCArIHIpID4+IDE7ICAKCWludCByZXMgPSBmaW5kS3RoKGlkICogMiwgbCwgbWlkLCBrKTsgCglpZiAocmVzID09IG4gKyAxKSByZXMgPSBmaW5kS3RoKGlkICogMiArIDEsIG1pZCArIDEsIHIsIGsgLSBzZWdbaWQgKiAyXSk7ICAKCXJldHVybiByZXM7IAp9CgppbnQgbGFzdFtOXTsgCmludCBueHRbTl07IC8vIG54dFtsXSA9IHbhu4sgdHLDrSBsJyBn4bqnbiBuaOG6pXQgPiBsIHNhbyBjaG8gYVtsJ10gPSBhW2xdICAKaW50IGZpcnN0X3JbTl07IC8vIGZpcnN0X3JbbF0gPSDEkeG6p3UgbcO6dCByIG5o4buPIG5o4bqldCB0aG/huqMgbcOjbiDEkW/huqFuIFtsLCByXSBjw7MgPj0ga1tsXSBnacOhIHRy4buLIHBow6JuIGJp4buHdAoKdm9pZCBwcmVjb21wdXRlKCkgewoJZm9yIChpbnQgbCA9IG47IGwgPj0gMTsgbC0tKSB7CgkJbnh0W2xdID0gKGxhc3RbYVtsXV0gPT0gMCkgPyBuICsgMSA6IGxhc3RbYVtsXV07ICAKCQlsYXN0W2FbbF1dID0gbDsgIAoJfQoKCWZvciAoaW50IGwgPSBuOyBsID49IDE7IGwtLSkgewoJCWlmIChueHRbbF0gPD0gbikgdXBkYXRlKDEsIDEsIG4sIG54dFtsXSwgLTEpOyAKCQl1cGRhdGUoMSwgMSwgbiwgbCwgMSk7IAoJCWZpcnN0X3JbbF0gPSBmaW5kS3RoKDEsIDEsIG4sIGtbbF0pOyAKCX0KfQoKaW50IGRwW05dOyAvLyBkcFtsXSA9IGPDsyBiYW8gbmhpw6p1IGPDoWNoIHBow6JuIHLDoyDEkW/huqFuIFtsLCBuXSAKaW50IHN1Zl9kcFtOXTsgLy8gc3VmX2RwW2xdID0gdOG7lW5nIGPDoWMgZHBbbF0sIGRwW2wgKyAxXSwuLi4sIGRwW25dIAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgIAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjaW4gPj4ga1tpXTsgIAogCQogCWNvbXByZXNzKGEpOyAgCglwcmVjb21wdXRlKCk7CgoJZHBbbiArIDFdID0gc3VmX2RwW24gKyAxXSA9IDE7ICAKCWZvciAoaW50IGwgPSBuOyBsID49IDE7IGwtLSkgewoJCWRwW2xdID0gYWRkKGRwW2xdLCBzdWZfZHBbZmlyc3RfcltsXSArIDFdKTsKCQlzdWZfZHBbbF0gPSBhZGQoc3VmX2RwW2wgKyAxXSwgZHBbbF0pOyAKCX0KCgljb3V0IDw8IGRwWzFdIDw8ICdcbic7IAp9