#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define int long long
#define itachi ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fi first
#define se second
using namespace std;
const int MOD = 1e9 + 7;
vector<pair<int, int>> dpL, dpR;
vector<int> sufL, sufR;
multiset<int> smallVals;
map<int, int> bigVals;
int q, L, R;
void build_suffix(vector<pair<int, int>> &dp, vector<int> &suf) {
int n = (int)dp.size();
suf.assign(n + 1, 0);
for (int i = n - 1; i >= 0; --i) {
suf[i] = suf[i + 1] + dp[i].se;
if (suf[i] >= MOD) suf[i] -= MOD;
}
}
void add_small(vector<pair<int, int>> &dp, vector<int> &suf, int x) {
if (dp.empty()) return;
if (x == 1) {
for (auto &p : dp) p.se = (p.se * 2) % MOD;
build_suffix(dp, suf);
return;
}
vector<pair<int, int>> take;
take.reserve(dp.size());
for (auto &p : dp) {
if (p.fi >= x) take.push_back({p.fi / x, p.se});
}
vector<pair<int, int>> nxt;
nxt.reserve(dp.size() + take.size());
int i = 0, j = 0;
int n = (int)dp.size(), m = (int)take.size();
while (i < n || j < m) {
int key;
if (j == m || (i < n && dp[i].fi < take[j].fi)) key = dp[i].fi;
else if (i == n || take[j].fi < dp[i].fi) key = take[j].fi;
else key = dp[i].fi;
int val = 0;
while (i < n && dp[i].fi == key) {
val += dp[i].se;
if (val >= MOD) val -= MOD;
++i;
}
while (j < m && take[j].fi == key) {
val += take[j].se;
if (val >= MOD) val -= MOD;
++j;
}
nxt.push_back({key, val});
}
dp.swap(nxt);
build_suffix(dp, suf);
}
void rebuild(vector<pair<int, int>> &dp, vector<int> &suf, int lim) {
dp.clear();
if (lim <= 0) {
suf.assign(1, 0);
return;
}
dp.push_back({lim, 1});
build_suffix(dp, suf);
for (int x : smallVals) add_small(dp, suf, x);
}
vector<pair<int, int>> get_big_distinct() {
vector<pair<int, int>> b;
b.reserve(bigVals.size());
for (auto &it : bigVals) b.push_back({it.fi, it.se});
return b;
}
int solve_limit(vector<pair<int, int>> &dp, vector<int> &suf, int lim) {
if (lim <= 0 || dp.empty()) return 0;
vector<pair<int, int>> b = get_big_distinct();
vector<pair<int, int>> bigquery;
bigquery.reserve(1 + (int)b.size() * 8);
auto addq = [&](int prod, int ways) {
if (prod <= lim) bigquery.push_back({prod, ways % MOD});
};
addq(1, 1);
int m = (int)b.size();
for (int i = 0; i < m; ++i) {
int v = b[i].fi, c = b[i].se;
if (v <= lim) addq(v, c);
if (c >= 2 && v <= lim / v) {
int ways = (c * (c - 1) / 2) % MOD;
addq(v * v, ways);
}
if (c >= 3 && v <= lim / v / v) {
int ways = (c * (c - 1) * (c - 2) / 6) % MOD;
addq(v * v * v, ways);
}
for (int j = i + 1; j < m; ++j) {
int u = b[j].fi, d = b[j].se;
if (v > lim / u) break;
int ways12 = (c * d) % MOD;
int prod12 = v * u;
addq(prod12, ways12);
if (c >= 2 && prod12 <= lim / v) {
int ways = (c * (c - 1) / 2) % MOD;
ways = (ways * d) % MOD;
addq(v * v * u, ways);
}
if (d >= 2 && prod12 <= lim / u) {
int ways = (d * (d - 1) / 2) % MOD;
ways = (ways * c) % MOD;
addq(v * u * u, ways);
}
for (int k = j + 1; k < m; ++k) {
int w = b[k].fi, e = b[k].se;
if (prod12 > lim / w) break;
int ways = c;
ways = (ways * d) % MOD;
ways = (ways * e) % MOD;
addq(prod12 * w, ways);
}
}
}
sort(bigquery.begin(), bigquery.end());
vector<pair<int, int>> comp;
comp.reserve(bigquery.size());
for (auto &p : bigquery) {
if (comp.empty() || comp.back().fi != p.fi) comp.push_back(p);
else {
comp.back().se += p.se;
if (comp.back().se >= MOD) comp.back().se -= MOD;
}
}
int ans = 0;
int p = 0, n = (int)dp.size();
for (auto &qv : comp) {
int need = qv.fi;
int ways = qv.se;
while (p < n && dp[p].fi < need) ++p;
ans += (suf[p] * ways) % MOD;
if (ans >= MOD) ans -= MOD;
}
return ans;
}
signed main() {
itachi
freopen("CPROD.inp", "r", stdin);
freopen("CPROD.out", "w", stdout);
cin >> q >> L >> R;
rebuild(dpL, sufL, L - 1);
rebuild(dpR, sufR, R);
while (q--) {
char opt;
int x;
cin >> opt >> x;
if (x <= 180) {
if (opt == '+') {
smallVals.insert(x);
add_small(dpL, sufL, x);
add_small(dpR, sufR, x);
} else {
auto it = smallVals.find(x);
if (it != smallVals.end()) {
smallVals.erase(it);
rebuild(dpL, sufL, L - 1);
rebuild(dpR, sufR, R);
}
}
} else {
if (opt == '+') {
bigVals[x]++;
} else {
auto it = bigVals.find(x);
if (it != bigVals.end()) {
if (--it->se == 0) bigVals.erase(it);
}
}
}
int ansR = solve_limit(dpR, sufR, R);
int ansL = solve_limit(dpL, sufL, L - 1);
int ans = ansR - ansL;
if (ans < 0) ans += MOD;
cout << ans << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMyx1bnJvbGwtbG9vcHMiKQojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBpdGFjaGkgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKCnZlY3RvcjxwYWlyPGludCwgaW50Pj4gZHBMLCBkcFI7CnZlY3RvcjxpbnQ+IHN1ZkwsIHN1ZlI7CgptdWx0aXNldDxpbnQ+IHNtYWxsVmFsczsKbWFwPGludCwgaW50PiBiaWdWYWxzOwoKaW50IHEsIEwsIFI7Cgp2b2lkIGJ1aWxkX3N1ZmZpeCh2ZWN0b3I8cGFpcjxpbnQsIGludD4+ICZkcCwgdmVjdG9yPGludD4gJnN1ZikgewogICAgaW50IG4gPSAoaW50KWRwLnNpemUoKTsKICAgIHN1Zi5hc3NpZ24obiArIDEsIDApOwogICAgZm9yIChpbnQgaSA9IG4gLSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHN1ZltpXSA9IHN1ZltpICsgMV0gKyBkcFtpXS5zZTsKICAgICAgICBpZiAoc3VmW2ldID49IE1PRCkgc3VmW2ldIC09IE1PRDsKICAgIH0KfQoKdm9pZCBhZGRfc21hbGwodmVjdG9yPHBhaXI8aW50LCBpbnQ+PiAmZHAsIHZlY3RvcjxpbnQ+ICZzdWYsIGludCB4KSB7CiAgICBpZiAoZHAuZW1wdHkoKSkgcmV0dXJuOwoKICAgIGlmICh4ID09IDEpIHsKICAgICAgICBmb3IgKGF1dG8gJnAgOiBkcCkgcC5zZSA9IChwLnNlICogMikgJSBNT0Q7CiAgICAgICAgYnVpbGRfc3VmZml4KGRwLCBzdWYpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IHRha2U7CiAgICB0YWtlLnJlc2VydmUoZHAuc2l6ZSgpKTsKCiAgICBmb3IgKGF1dG8gJnAgOiBkcCkgewogICAgICAgIGlmIChwLmZpID49IHgpIHRha2UucHVzaF9iYWNrKHtwLmZpIC8geCwgcC5zZX0pOwogICAgfQoKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gbnh0OwogICAgbnh0LnJlc2VydmUoZHAuc2l6ZSgpICsgdGFrZS5zaXplKCkpOwoKICAgIGludCBpID0gMCwgaiA9IDA7CiAgICBpbnQgbiA9IChpbnQpZHAuc2l6ZSgpLCBtID0gKGludCl0YWtlLnNpemUoKTsKCiAgICB3aGlsZSAoaSA8IG4gfHwgaiA8IG0pIHsKICAgICAgICBpbnQga2V5OwogICAgICAgIGlmIChqID09IG0gfHwgKGkgPCBuICYmIGRwW2ldLmZpIDwgdGFrZVtqXS5maSkpIGtleSA9IGRwW2ldLmZpOwogICAgICAgIGVsc2UgaWYgKGkgPT0gbiB8fCB0YWtlW2pdLmZpIDwgZHBbaV0uZmkpIGtleSA9IHRha2Vbal0uZmk7CiAgICAgICAgZWxzZSBrZXkgPSBkcFtpXS5maTsKCiAgICAgICAgaW50IHZhbCA9IDA7CgogICAgICAgIHdoaWxlIChpIDwgbiAmJiBkcFtpXS5maSA9PSBrZXkpIHsKICAgICAgICAgICAgdmFsICs9IGRwW2ldLnNlOwogICAgICAgICAgICBpZiAodmFsID49IE1PRCkgdmFsIC09IE1PRDsKICAgICAgICAgICAgKytpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoaiA8IG0gJiYgdGFrZVtqXS5maSA9PSBrZXkpIHsKICAgICAgICAgICAgdmFsICs9IHRha2Vbal0uc2U7CiAgICAgICAgICAgIGlmICh2YWwgPj0gTU9EKSB2YWwgLT0gTU9EOwogICAgICAgICAgICArK2o7CiAgICAgICAgfQoKICAgICAgICBueHQucHVzaF9iYWNrKHtrZXksIHZhbH0pOwogICAgfQoKICAgIGRwLnN3YXAobnh0KTsKICAgIGJ1aWxkX3N1ZmZpeChkcCwgc3VmKTsKfQoKdm9pZCByZWJ1aWxkKHZlY3RvcjxwYWlyPGludCwgaW50Pj4gJmRwLCB2ZWN0b3I8aW50PiAmc3VmLCBpbnQgbGltKSB7CiAgICBkcC5jbGVhcigpOwogICAgaWYgKGxpbSA8PSAwKSB7CiAgICAgICAgc3VmLmFzc2lnbigxLCAwKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZHAucHVzaF9iYWNrKHtsaW0sIDF9KTsKICAgIGJ1aWxkX3N1ZmZpeChkcCwgc3VmKTsKCiAgICBmb3IgKGludCB4IDogc21hbGxWYWxzKSBhZGRfc21hbGwoZHAsIHN1ZiwgeCk7Cn0KCnZlY3RvcjxwYWlyPGludCwgaW50Pj4gZ2V0X2JpZ19kaXN0aW5jdCgpIHsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gYjsKICAgIGIucmVzZXJ2ZShiaWdWYWxzLnNpemUoKSk7CiAgICBmb3IgKGF1dG8gJml0IDogYmlnVmFscykgYi5wdXNoX2JhY2soe2l0LmZpLCBpdC5zZX0pOwogICAgcmV0dXJuIGI7Cn0KCmludCBzb2x2ZV9saW1pdCh2ZWN0b3I8cGFpcjxpbnQsIGludD4+ICZkcCwgdmVjdG9yPGludD4gJnN1ZiwgaW50IGxpbSkgewogICAgaWYgKGxpbSA8PSAwIHx8IGRwLmVtcHR5KCkpIHJldHVybiAwOwoKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gYiA9IGdldF9iaWdfZGlzdGluY3QoKTsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gYmlncXVlcnk7CiAgICBiaWdxdWVyeS5yZXNlcnZlKDEgKyAoaW50KWIuc2l6ZSgpICogOCk7CgogICAgYXV0byBhZGRxID0gWyZdKGludCBwcm9kLCBpbnQgd2F5cykgewogICAgICAgIGlmIChwcm9kIDw9IGxpbSkgYmlncXVlcnkucHVzaF9iYWNrKHtwcm9kLCB3YXlzICUgTU9EfSk7CiAgICB9OwoKICAgIGFkZHEoMSwgMSk7CgogICAgaW50IG0gPSAoaW50KWIuc2l6ZSgpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgaW50IHYgPSBiW2ldLmZpLCBjID0gYltpXS5zZTsKCiAgICAgICAgaWYgKHYgPD0gbGltKSBhZGRxKHYsIGMpOwoKICAgICAgICBpZiAoYyA+PSAyICYmIHYgPD0gbGltIC8gdikgewogICAgICAgICAgICBpbnQgd2F5cyA9IChjICogKGMgLSAxKSAvIDIpICUgTU9EOwogICAgICAgICAgICBhZGRxKHYgKiB2LCB3YXlzKTsKICAgICAgICB9CgogICAgICAgIGlmIChjID49IDMgJiYgdiA8PSBsaW0gLyB2IC8gdikgewogICAgICAgICAgICBpbnQgd2F5cyA9IChjICogKGMgLSAxKSAqIChjIC0gMikgLyA2KSAlIE1PRDsKICAgICAgICAgICAgYWRkcSh2ICogdiAqIHYsIHdheXMpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgIGludCB1ID0gYltqXS5maSwgZCA9IGJbal0uc2U7CgogICAgICAgICAgICBpZiAodiA+IGxpbSAvIHUpIGJyZWFrOwoKICAgICAgICAgICAgaW50IHdheXMxMiA9IChjICogZCkgJSBNT0Q7CiAgICAgICAgICAgIGludCBwcm9kMTIgPSB2ICogdTsKICAgICAgICAgICAgYWRkcShwcm9kMTIsIHdheXMxMik7CgogICAgICAgICAgICBpZiAoYyA+PSAyICYmIHByb2QxMiA8PSBsaW0gLyB2KSB7CiAgICAgICAgICAgICAgICBpbnQgd2F5cyA9IChjICogKGMgLSAxKSAvIDIpICUgTU9EOwogICAgICAgICAgICAgICAgd2F5cyA9ICh3YXlzICogZCkgJSBNT0Q7CiAgICAgICAgICAgICAgICBhZGRxKHYgKiB2ICogdSwgd2F5cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkID49IDIgJiYgcHJvZDEyIDw9IGxpbSAvIHUpIHsKICAgICAgICAgICAgICAgIGludCB3YXlzID0gKGQgKiAoZCAtIDEpIC8gMikgJSBNT0Q7CiAgICAgICAgICAgICAgICB3YXlzID0gKHdheXMgKiBjKSAlIE1PRDsKICAgICAgICAgICAgICAgIGFkZHEodiAqIHUgKiB1LCB3YXlzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpbnQgayA9IGogKyAxOyBrIDwgbTsgKytrKSB7CiAgICAgICAgICAgICAgICBpbnQgdyA9IGJba10uZmksIGUgPSBiW2tdLnNlOwogICAgICAgICAgICAgICAgaWYgKHByb2QxMiA+IGxpbSAvIHcpIGJyZWFrOwoKICAgICAgICAgICAgICAgIGludCB3YXlzID0gYzsKICAgICAgICAgICAgICAgIHdheXMgPSAod2F5cyAqIGQpICUgTU9EOwogICAgICAgICAgICAgICAgd2F5cyA9ICh3YXlzICogZSkgJSBNT0Q7CiAgICAgICAgICAgICAgICBhZGRxKHByb2QxMiAqIHcsIHdheXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHNvcnQoYmlncXVlcnkuYmVnaW4oKSwgYmlncXVlcnkuZW5kKCkpOwoKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gY29tcDsKICAgIGNvbXAucmVzZXJ2ZShiaWdxdWVyeS5zaXplKCkpOwoKICAgIGZvciAoYXV0byAmcCA6IGJpZ3F1ZXJ5KSB7CiAgICAgICAgaWYgKGNvbXAuZW1wdHkoKSB8fCBjb21wLmJhY2soKS5maSAhPSBwLmZpKSBjb21wLnB1c2hfYmFjayhwKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29tcC5iYWNrKCkuc2UgKz0gcC5zZTsKICAgICAgICAgICAgaWYgKGNvbXAuYmFjaygpLnNlID49IE1PRCkgY29tcC5iYWNrKCkuc2UgLT0gTU9EOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgYW5zID0gMDsKICAgIGludCBwID0gMCwgbiA9IChpbnQpZHAuc2l6ZSgpOwoKICAgIGZvciAoYXV0byAmcXYgOiBjb21wKSB7CiAgICAgICAgaW50IG5lZWQgPSBxdi5maTsKICAgICAgICBpbnQgd2F5cyA9IHF2LnNlOwoKICAgICAgICB3aGlsZSAocCA8IG4gJiYgZHBbcF0uZmkgPCBuZWVkKSArK3A7CgogICAgICAgIGFucyArPSAoc3VmW3BdICogd2F5cykgJSBNT0Q7CiAgICAgICAgaWYgKGFucyA+PSBNT0QpIGFucyAtPSBNT0Q7CiAgICB9CgogICAgcmV0dXJuIGFuczsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpdGFjaGkKICAgIAogICAgZnJlb3BlbigiQ1BST0QuaW5wIiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJDUFJPRC5vdXQiLCAidyIsIHN0ZG91dCk7CgogICAgY2luID4+IHEgPj4gTCA+PiBSOwoKICAgIHJlYnVpbGQoZHBMLCBzdWZMLCBMIC0gMSk7CiAgICByZWJ1aWxkKGRwUiwgc3VmUiwgUik7CgogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGNoYXIgb3B0OwogICAgICAgIGludCB4OwogICAgICAgIGNpbiA+PiBvcHQgPj4geDsKCiAgICAgICAgaWYgKHggPD0gMTgwKSB7CiAgICAgICAgICAgIGlmIChvcHQgPT0gJysnKSB7CiAgICAgICAgICAgICAgICBzbWFsbFZhbHMuaW5zZXJ0KHgpOwogICAgICAgICAgICAgICAgYWRkX3NtYWxsKGRwTCwgc3VmTCwgeCk7CiAgICAgICAgICAgICAgICBhZGRfc21hbGwoZHBSLCBzdWZSLCB4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBzbWFsbFZhbHMuZmluZCh4KTsKICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzbWFsbFZhbHMuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICBzbWFsbFZhbHMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgICAgIHJlYnVpbGQoZHBMLCBzdWZMLCBMIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgcmVidWlsZChkcFIsIHN1ZlIsIFIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG9wdCA9PSAnKycpIHsKICAgICAgICAgICAgICAgIGJpZ1ZhbHNbeF0rKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBiaWdWYWxzLmZpbmQoeCk7CiAgICAgICAgICAgICAgICBpZiAoaXQgIT0gYmlnVmFscy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgtLWl0LT5zZSA9PSAwKSBiaWdWYWxzLmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGFuc1IgPSBzb2x2ZV9saW1pdChkcFIsIHN1ZlIsIFIpOwogICAgICAgIGludCBhbnNMID0gc29sdmVfbGltaXQoZHBMLCBzdWZMLCBMIC0gMSk7CgogICAgICAgIGludCBhbnMgPSBhbnNSIC0gYW5zTDsKICAgICAgICBpZiAoYW5zIDwgMCkgYW5zICs9IE1PRDsKCiAgICAgICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=