#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 n;
int a[N];
int k[N];
int add(int a, int b) {
return (a + b) % MOD;
}
// Segment Tree tối ưu precompute
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];
}
int get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return seg[id];
int mid = (l + r) >> 1;
return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
}
// Tìm i đầu tiên sao cho sum[1..i] >= k
int findKth(int id, int l, int r, int k) {
if (seg[id] < k) return n + 1;
if (l == r) return l;
int mid = (l + r) >> 1;
int ans_child_l = findKth(id * 2, l, mid, k);
if (ans_child_l <= n) return ans_child_l;
return findKth(id * 2 + 1, mid + 1, r, k - seg[id * 2]);
}
int nxt[N]; // nxt[l] là vị trí l' đầu tiên > l sao cho a[l'] == a[l]
int first_r[N]; // first_r[l]: đầu mút r đầu tiên thoả mãn đoạn [l, r] có >= k[l] giá trị phân biệt
void precompute() {
map<int, int> last;
for (int l = n; l >= 1; l--) {
nxt[l] = last.count(a[l]) ? last[a[l]] : n + 1;
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[] trong đoạn [l, n]
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> k[i];
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+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsgIAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAgCgpjb25zdCBpbnQgSU5GID0gMWU5OyAgCmNvbnN0IGxsIExJTkYgPSAxZTE4OyAgCgpjb25zdCBpbnQgTiA9IDFlNiArIDU7IApjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgIAoKaW50IG47IAppbnQgYVtOXTsKaW50IGtbTl07IAoKaW50IGFkZChpbnQgYSwgaW50IGIpIHsKICAgIHJldHVybiAoYSArIGIpICUgTU9EOyAKfQoKLy8gU2VnbWVudCBUcmVlIHThu5FpIMawdSBwcmVjb21wdXRlCgppbnQgc2VnWzQgKiBOXTsgCgp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHBvcywgaW50IHZhbCkgewogICAgaWYgKGwgPiBwb3MgfHwgciA8IHBvcykgcmV0dXJuOyAgCgogICAgaWYgKGwgPT0gcikgewogICAgICAgIHNlZ1tpZF0gKz0gdmFsOyAgCiAgICAgICAgcmV0dXJuOyAKICAgIH0KCiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOyAKICAgIHVwZGF0ZShpZCAqIDIsIGwsIG1pZCwgcG9zLCB2YWwpOyAKICAgIHVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCBwb3MsIHZhbCk7IAoKICAgIHNlZ1tpZF0gPSBzZWdbaWQgKiAyXSArIHNlZ1tpZCAqIDIgKyAxXTsgCn0KCmludCBnZXQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikgewogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm4gMDsgIAoKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc2VnW2lkXTsgCgogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgogICAgcmV0dXJuIGdldChpZCAqIDIsIGwsIG1pZCwgdSwgdikgKyBnZXQoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdik7IAp9CgovLyBUw6xtIGkgxJHhuqd1IHRpw6puIHNhbyBjaG8gc3VtWzEuLmldID49IGsKaW50IGZpbmRLdGgoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBrKSB7CiAgICBpZiAoc2VnW2lkXSA8IGspIHJldHVybiBuICsgMTsgIAoKICAgIGlmIChsID09IHIpIHJldHVybiBsOyAgCgogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsgIAoKICAgIGludCBhbnNfY2hpbGRfbCA9IGZpbmRLdGgoaWQgKiAyLCBsLCBtaWQsIGspOyAKICAgIGlmIChhbnNfY2hpbGRfbCA8PSBuKSByZXR1cm4gYW5zX2NoaWxkX2w7IAoKICAgIHJldHVybiBmaW5kS3RoKGlkICogMiArIDEsIG1pZCArIDEsIHIsIGsgLSBzZWdbaWQgKiAyXSk7IAp9CgppbnQgbnh0W05dOyAvLyBueHRbbF0gbMOgIHbhu4sgdHLDrSBsJyDEkeG6p3UgdGnDqm4gPiBsIHNhbyBjaG8gYVtsJ10gPT0gYVtsXSAgCmludCBmaXJzdF9yW05dOyAvLyBmaXJzdF9yW2xdOiDEkeG6p3UgbcO6dCByIMSR4bqndSB0acOqbiB0aG/huqMgbcOjbiDEkW/huqFuIFtsLCByXSBjw7MgPj0ga1tsXSBnacOhIHRy4buLIHBow6JuIGJp4buHdAoKdm9pZCBwcmVjb21wdXRlKCkgewogICAgbWFwPGludCwgaW50PiBsYXN0OyAgCgogICAgZm9yIChpbnQgbCA9IG47IGwgPj0gMTsgbC0tKSB7CiAgICAgICAgbnh0W2xdID0gbGFzdC5jb3VudChhW2xdKSA/IGxhc3RbYVtsXV0gOiBuICsgMTsgIAogICAgICAgIGxhc3RbYVtsXV0gPSBsOyAgCiAgICB9CgogICAgZm9yIChpbnQgbCA9IG47IGwgPj0gMTsgbC0tKSB7CiAgICAgICAgaWYgKG54dFtsXSA8PSBuKSB1cGRhdGUoMSwgMSwgbiwgbnh0W2xdLCAtMSk7IAogICAgICAgIHVwZGF0ZSgxLCAxLCBuLCBsLCAxKTsgCiAgICAgICAgZmlyc3RfcltsXSA9IGZpbmRLdGgoMSwgMSwgbiwga1tsXSk7IAogICAgfQp9CgppbnQgZHBbTl07IC8vIGRwW2xdID0gY8OzIGJhbyBuaGnDqnUgY8OhY2ggcGjDom4gcsOjIMSRb+G6oW4gW2wsIG5dIAppbnQgc3VmX2RwW05dOyAvLyBzdWZfZHBbbF0gPSB04buVbmcgY8OhYyBkcFtdIHRyb25nIMSRb+G6oW4gW2wsIG5dIAoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgICAgCiAgICBjaW4gPj4gbjsgCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOyAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGtbaV07ICAKCiAgICBwcmVjb21wdXRlKCk7CgogICAgZHBbbiArIDFdID0gc3VmX2RwW24gKyAxXSA9IDE7ICAKCiAgICBmb3IgKGludCBsID0gbjsgbCA+PSAxOyBsLS0pIHsKICAgICAgICBkcFtsXSA9IGFkZChkcFtsXSwgc3VmX2RwW2ZpcnN0X3JbbF0gKyAxXSk7CiAgICAgICAgc3VmX2RwW2xdID0gYWRkKHN1Zl9kcFtsICsgMV0sIGRwW2xdKTsgCiAgICB9CgogICAgY291dCA8PCBkcFsxXSA8PCAnXG4nOyAKfQo=