#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define int long long
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int mod = 1e9 + 7;
// ===== STATE L =====
int limL;
vector<pair<int,int>> dpL;
vector<int> sufL;
// ===== STATE R =====
int limR;
vector<pair<int,int>> dpR;
vector<int> sufR;
multiset<int> smalls;
map<int,int> big;
// ===== INIT =====
void initL(int lim){
limL = lim;
dpL.clear();
sufL.clear();
if(limL >= 0){
dpL.push_back({limL,1});
sufL = {0,1};
}
}
void initR(int lim){
limR = lim;
dpR.clear();
sufR.clear();
if(limR >= 0){
dpR.push_back({limR,1});
sufR = {0,1};
}
}
// ===== BUILD SUFFIX =====
void build_suf(vector<pair<int,int>> &dp, vector<int> &suf){
int sz = dp.size();
suf.assign(sz+1,0);
for(int i=sz-1;i>=0;i--){
suf[i] = (suf[i+1] + dp[i].second) % mod;
}
}
// ===== ADD SMALL =====
void add_small(vector<pair<int,int>> &dp, vector<int> &suf, int x){
if(x <= 1) return;
unordered_map<int,int> nxt;
for(auto &p : dp){
nxt[p.first] = (nxt[p.first] + p.second) % mod;
if(p.first >= x){
int v = p.first / x;
nxt[v] = (nxt[v] + p.second) % mod;
}
}
dp.clear();
for(auto &p : nxt) dp.push_back(p);
sort(dp.begin(), dp.end());
build_suf(dp, suf);
}
// ===== REBUILD =====
void rebuild(vector<pair<int,int>> &dp, vector<int> &suf, int lim){
unordered_map<int,int> cur;
cur[lim] = 1;
for(int x : smalls){
unordered_map<int,int> nxt = cur;
for(auto &p : cur){
if(p.first >= x){
int v = p.first / x;
nxt[v] = (nxt[v] + p.second) % mod;
}
}
cur = nxt;
}
dp.clear();
for(auto &p : cur) dp.push_back(p);
sort(dp.begin(), dp.end());
build_suf(dp, suf);
}
// ===== QUERY =====
int calc(vector<pair<int,int>> &dp, vector<int> &suf, vector<int> &bigp){
int total = suf[0];
int p = 0;
int sz = dp.size();
for(int i = (int)bigp.size()-1; i>=0; i--){
while(p < sz && dp[p].first < bigp[i]) p++;
if(p < sz) total = (total + suf[p]) % mod;
}
return total;
}
// ===== SOLVE =====
void solve(){
int q,L,R;
cin >> q >> L >> R;
initL(L-1);
initR(R);
while(q--){
char op; int x;
cin >> op >> x;
if(x <= 180){
if(op == '+'){
smalls.insert(x);
add_small(dpL, sufL, x);
add_small(dpR, sufR, x);
}else{
auto it = smalls.find(x);
if(it != smalls.end()){
smalls.erase(it);
rebuild(dpL, sufL, L-1);
rebuild(dpR, sufR, R);
}
}
}else{
if(op == '+') big[x]++;
else{
if(big[x]){
big[x]--;
if(big[x] == 0) big.erase(x);
}
}
}
// ===== build big products =====
vector<int> bigp;
vector<pair<int,int>> b(big.begin(), big.end());
int n = b.size();
for(int i=0;i<n;i++){
int v1 = b[i].first;
for(int c1=1;c1<=min(3LL,b[i].second);c1++){
int p1 = 1;
bool ok = 1;
for(int k=0;k<c1;k++){
if(p1 > R / v1){ ok=0; break; }
p1 *= v1;
}
if(!ok) break;
bigp.push_back(p1);
for(int j=i+1;j<n;j++){
int v2 = b[j].first;
int p2 = p1;
for(int c2=1;c2<=min(3LL-c1,b[j].second);c2++){
if(p2 > R / v2) break;
p2 *= v2;
bigp.push_back(p2);
if(c1 + c2 < 3){
for(int k=j+1;k<n;k++){
if(p2 <= R / b[k].first)
bigp.push_back(p2 * b[k].first);
}
}
}
}
}
}
sort(bigp.begin(), bigp.end());
int ansR = calc(dpR, sufR, bigp);
int ansL = calc(dpL, sufL, bigp);
cout << (ansR - ansL + mod) % mod << '\n';
}
}
signed main(){
itachi
freopen("CPROD.inp","r",stdin);
freopen("CPROD.out","w",stdout);
solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMyx1bnJvbGwtbG9vcHMiKQojcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIsbHpjbnQscG9wY250IikKCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGl0YWNoaSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CgovLyA9PT09PSBTVEFURSBMID09PT09CmludCBsaW1MOwp2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gZHBMOwp2ZWN0b3I8aW50PiBzdWZMOwoKLy8gPT09PT0gU1RBVEUgUiA9PT09PQppbnQgbGltUjsKdmVjdG9yPHBhaXI8aW50LGludD4+IGRwUjsKdmVjdG9yPGludD4gc3VmUjsKCm11bHRpc2V0PGludD4gc21hbGxzOwptYXA8aW50LGludD4gYmlnOwoKLy8gPT09PT0gSU5JVCA9PT09PQp2b2lkIGluaXRMKGludCBsaW0pewogICAgbGltTCA9IGxpbTsKICAgIGRwTC5jbGVhcigpOwogICAgc3VmTC5jbGVhcigpOwogICAgaWYobGltTCA+PSAwKXsKICAgICAgICBkcEwucHVzaF9iYWNrKHtsaW1MLDF9KTsKICAgICAgICBzdWZMID0gezAsMX07CiAgICB9Cn0KCnZvaWQgaW5pdFIoaW50IGxpbSl7CiAgICBsaW1SID0gbGltOwogICAgZHBSLmNsZWFyKCk7CiAgICBzdWZSLmNsZWFyKCk7CiAgICBpZihsaW1SID49IDApewogICAgICAgIGRwUi5wdXNoX2JhY2soe2xpbVIsMX0pOwogICAgICAgIHN1ZlIgPSB7MCwxfTsKICAgIH0KfQoKLy8gPT09PT0gQlVJTEQgU1VGRklYID09PT09CnZvaWQgYnVpbGRfc3VmKHZlY3RvcjxwYWlyPGludCxpbnQ+PiAmZHAsIHZlY3RvcjxpbnQ+ICZzdWYpewogICAgaW50IHN6ID0gZHAuc2l6ZSgpOwogICAgc3VmLmFzc2lnbihzeisxLDApOwogICAgZm9yKGludCBpPXN6LTE7aT49MDtpLS0pewogICAgICAgIHN1ZltpXSA9IChzdWZbaSsxXSArIGRwW2ldLnNlY29uZCkgJSBtb2Q7CiAgICB9Cn0KCi8vID09PT09IEFERCBTTUFMTCA9PT09PQp2b2lkIGFkZF9zbWFsbCh2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gJmRwLCB2ZWN0b3I8aW50PiAmc3VmLCBpbnQgeCl7CiAgICBpZih4IDw9IDEpIHJldHVybjsKCiAgICB1bm9yZGVyZWRfbWFwPGludCxpbnQ+IG54dDsKCiAgICBmb3IoYXV0byAmcCA6IGRwKXsKICAgICAgICBueHRbcC5maXJzdF0gPSAobnh0W3AuZmlyc3RdICsgcC5zZWNvbmQpICUgbW9kOwogICAgICAgIGlmKHAuZmlyc3QgPj0geCl7CiAgICAgICAgICAgIGludCB2ID0gcC5maXJzdCAvIHg7CiAgICAgICAgICAgIG54dFt2XSA9IChueHRbdl0gKyBwLnNlY29uZCkgJSBtb2Q7CiAgICAgICAgfQogICAgfQoKICAgIGRwLmNsZWFyKCk7CiAgICBmb3IoYXV0byAmcCA6IG54dCkgZHAucHVzaF9iYWNrKHApOwogICAgc29ydChkcC5iZWdpbigpLCBkcC5lbmQoKSk7CgogICAgYnVpbGRfc3VmKGRwLCBzdWYpOwp9CgovLyA9PT09PSBSRUJVSUxEID09PT09CnZvaWQgcmVidWlsZCh2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gJmRwLCB2ZWN0b3I8aW50PiAmc3VmLCBpbnQgbGltKXsKICAgIHVub3JkZXJlZF9tYXA8aW50LGludD4gY3VyOwogICAgY3VyW2xpbV0gPSAxOwoKICAgIGZvcihpbnQgeCA6IHNtYWxscyl7CiAgICAgICAgdW5vcmRlcmVkX21hcDxpbnQsaW50PiBueHQgPSBjdXI7CiAgICAgICAgZm9yKGF1dG8gJnAgOiBjdXIpewogICAgICAgICAgICBpZihwLmZpcnN0ID49IHgpewogICAgICAgICAgICAgICAgaW50IHYgPSBwLmZpcnN0IC8geDsKICAgICAgICAgICAgICAgIG54dFt2XSA9IChueHRbdl0gKyBwLnNlY29uZCkgJSBtb2Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3VyID0gbnh0OwogICAgfQoKICAgIGRwLmNsZWFyKCk7CiAgICBmb3IoYXV0byAmcCA6IGN1cikgZHAucHVzaF9iYWNrKHApOwogICAgc29ydChkcC5iZWdpbigpLCBkcC5lbmQoKSk7CgogICAgYnVpbGRfc3VmKGRwLCBzdWYpOwp9CgovLyA9PT09PSBRVUVSWSA9PT09PQppbnQgY2FsYyh2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gJmRwLCB2ZWN0b3I8aW50PiAmc3VmLCB2ZWN0b3I8aW50PiAmYmlncCl7CiAgICBpbnQgdG90YWwgPSBzdWZbMF07CiAgICBpbnQgcCA9IDA7CiAgICBpbnQgc3ogPSBkcC5zaXplKCk7CgogICAgZm9yKGludCBpID0gKGludCliaWdwLnNpemUoKS0xOyBpPj0wOyBpLS0pewogICAgICAgIHdoaWxlKHAgPCBzeiAmJiBkcFtwXS5maXJzdCA8IGJpZ3BbaV0pIHArKzsKICAgICAgICBpZihwIDwgc3opIHRvdGFsID0gKHRvdGFsICsgc3VmW3BdKSAlIG1vZDsKICAgIH0KICAgIHJldHVybiB0b3RhbDsKfQoKLy8gPT09PT0gU09MVkUgPT09PT0Kdm9pZCBzb2x2ZSgpewogICAgaW50IHEsTCxSOwogICAgY2luID4+IHEgPj4gTCA+PiBSOwoKICAgIGluaXRMKEwtMSk7CiAgICBpbml0UihSKTsKCiAgICB3aGlsZShxLS0pewogICAgICAgIGNoYXIgb3A7IGludCB4OwogICAgICAgIGNpbiA+PiBvcCA+PiB4OwoKICAgICAgICBpZih4IDw9IDE4MCl7CiAgICAgICAgICAgIGlmKG9wID09ICcrJyl7CiAgICAgICAgICAgICAgICBzbWFsbHMuaW5zZXJ0KHgpOwogICAgICAgICAgICAgICAgYWRkX3NtYWxsKGRwTCwgc3VmTCwgeCk7CiAgICAgICAgICAgICAgICBhZGRfc21hbGwoZHBSLCBzdWZSLCB4KTsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBhdXRvIGl0ID0gc21hbGxzLmZpbmQoeCk7CiAgICAgICAgICAgICAgICBpZihpdCAhPSBzbWFsbHMuZW5kKCkpewogICAgICAgICAgICAgICAgICAgIHNtYWxscy5lcmFzZShpdCk7CiAgICAgICAgICAgICAgICAgICAgcmVidWlsZChkcEwsIHN1ZkwsIEwtMSk7CiAgICAgICAgICAgICAgICAgICAgcmVidWlsZChkcFIsIHN1ZlIsIFIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGlmKG9wID09ICcrJykgYmlnW3hdKys7CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBpZihiaWdbeF0pewogICAgICAgICAgICAgICAgICAgIGJpZ1t4XS0tOwogICAgICAgICAgICAgICAgICAgIGlmKGJpZ1t4XSA9PSAwKSBiaWcuZXJhc2UoeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vID09PT09IGJ1aWxkIGJpZyBwcm9kdWN0cyA9PT09PQogICAgICAgIHZlY3RvcjxpbnQ+IGJpZ3A7CiAgICAgICAgdmVjdG9yPHBhaXI8aW50LGludD4+IGIoYmlnLmJlZ2luKCksIGJpZy5lbmQoKSk7CgogICAgICAgIGludCBuID0gYi5zaXplKCk7CgogICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspewogICAgICAgICAgICBpbnQgdjEgPSBiW2ldLmZpcnN0OwogICAgICAgICAgICBmb3IoaW50IGMxPTE7YzE8PW1pbigzTEwsYltpXS5zZWNvbmQpO2MxKyspewogICAgICAgICAgICAgICAgaW50IHAxID0gMTsKICAgICAgICAgICAgICAgIGJvb2wgb2sgPSAxOwogICAgICAgICAgICAgICAgZm9yKGludCBrPTA7azxjMTtrKyspewogICAgICAgICAgICAgICAgICAgIGlmKHAxID4gUiAvIHYxKXsgb2s9MDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBwMSAqPSB2MTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKCFvaykgYnJlYWs7CgogICAgICAgICAgICAgICAgYmlncC5wdXNoX2JhY2socDEpOwoKICAgICAgICAgICAgICAgIGZvcihpbnQgaj1pKzE7ajxuO2orKyl7CiAgICAgICAgICAgICAgICAgICAgaW50IHYyID0gYltqXS5maXJzdDsKICAgICAgICAgICAgICAgICAgICBpbnQgcDIgPSBwMTsKCiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBjMj0xO2MyPD1taW4oM0xMLWMxLGJbal0uc2Vjb25kKTtjMisrKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYocDIgPiBSIC8gdjIpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBwMiAqPSB2MjsKICAgICAgICAgICAgICAgICAgICAgICAgYmlncC5wdXNoX2JhY2socDIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYzEgKyBjMiA8IDMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBrPWorMTtrPG47aysrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwMiA8PSBSIC8gYltrXS5maXJzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlncC5wdXNoX2JhY2socDIgKiBiW2tdLmZpcnN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc29ydChiaWdwLmJlZ2luKCksIGJpZ3AuZW5kKCkpOwoKICAgICAgICBpbnQgYW5zUiA9IGNhbGMoZHBSLCBzdWZSLCBiaWdwKTsKICAgICAgICBpbnQgYW5zTCA9IGNhbGMoZHBMLCBzdWZMLCBiaWdwKTsKCiAgICAgICAgY291dCA8PCAoYW5zUiAtIGFuc0wgKyBtb2QpICUgbW9kIDw8ICdcbic7CiAgICB9Cn0KCnNpZ25lZCBtYWluKCl7CiAgICBpdGFjaGkKICAgIGZyZW9wZW4oIkNQUk9ELmlucCIsInIiLHN0ZGluKTsKICAgIGZyZW9wZW4oIkNQUk9ELm91dCIsInciLHN0ZG91dCk7CgogICAgc29sdmUoKTsKfQ==