#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
const long long MOD = 1e9 + 7;
long long cnt = 0;
vector<long long> A;
unordered_map<long long, long long> memo[305]; // Giới hạn mảng theo số lượng phần tử tối đa
// Hàm tính lũy thừa nhị phân cho 2^cnt
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
// Quy hoạch động đệ quy có nhớ theo chuẩn logic chỉ định
long long dp(int i, long long j) {
if (i == 0) {
if (j == 0) return 0;
else return 1;
}
if (j == 0) return 0;
if (j == 1) return 1;
// Trả về nếu đã lưu trong map
if (memo[i].count(j)) return memo[i][j];
// Gọi đệ quy: Không chọn A[i-1] + Chọn A[i-1]
long long res = dp(i - 1, j);
res = (res + dp(i - 1, j / A[i - 1])) % MOD; // A[i-1] do vector đánh index từ 0
return memo[i][j] = res;
}
int main() {
// Tối ưu I/O
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int Q;
long long L, R;
if (!(cin >> Q >> L >> R)) return 0;
while (Q--) {
char type;
long long x;
cin >> type >> x;
// Xử lý thao tác Thêm / Xóa
if (type == '+') {
if (x == 1) {
cnt++;
} else {
A.push_back(x);
sort(A.begin(), A.end()); // Đảm bảo dãy tăng dần
}
} else if (type == '-') {
if (x == 1) {
cnt--;
} else {
auto it = find(A.begin(), A.end(), x);
if (it != A.end()) {
A.erase(it);
}
}
}
int n = A.size();
// Clear mảng nhớ trạng thái trước khi đệ quy lại từ đầu
for (int i = 0; i <= n; i++) {
memo[i].clear();
}
// Tính kết quả cho đoạn [L, R]
long long ansR = dp(n, R);
long long ansL = (L > 1) ? dp(n, L - 1) : 0;
// Áp dụng công thức số cách = (dp(R) - dp(L-1)) * 2^cnt
long long final_ans = (ansR - ansL + MOD) % MOD;
final_ans = (final_ans * power(2, cnt)) % MOD;
cout << final_ans << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgTU9EID0gMWU5ICsgNzsKCmxvbmcgbG9uZyBjbnQgPSAwOwp2ZWN0b3I8bG9uZyBsb25nPiBBOwp1bm9yZGVyZWRfbWFwPGxvbmcgbG9uZywgbG9uZyBsb25nPiBtZW1vWzMwNV07IC8vIEdp4bubaSBo4bqhbiBt4bqjbmcgdGhlbyBz4buRIGzGsOG7o25nIHBo4bqnbiB04butIHThu5FpIMSRYQoKLy8gSMOgbSB0w61uaCBsxal5IHRo4burYSBuaOG7iyBwaMOibiBjaG8gMl5jbnQKbG9uZyBsb25nIHBvd2VyKGxvbmcgbG9uZyBiYXNlLCBsb25nIGxvbmcgZXhwKSB7CiAgICBsb25nIGxvbmcgcmVzID0gMTsKICAgIGJhc2UgJT0gTU9EOwogICAgd2hpbGUgKGV4cCA+IDApIHsKICAgICAgICBpZiAoZXhwICUgMiA9PSAxKSByZXMgPSAocmVzICogYmFzZSkgJSBNT0Q7CiAgICAgICAgYmFzZSA9IChiYXNlICogYmFzZSkgJSBNT0Q7CiAgICAgICAgZXhwIC89IDI7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovLyBRdXkgaG/huqFjaCDEkeG7mW5nIMSR4buHIHF1eSBjw7Mgbmjhu5sgdGhlbyBjaHXhuqluIGxvZ2ljIGNo4buJIMSR4buLbmgKbG9uZyBsb25nIGRwKGludCBpLCBsb25nIGxvbmcgaikgewogICAgaWYgKGkgPT0gMCkgewogICAgICAgIGlmIChqID09IDApIHJldHVybiAwOwogICAgICAgIGVsc2UgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgIGlmIChqID09IDApIHJldHVybiAwOwogICAgaWYgKGogPT0gMSkgcmV0dXJuIDE7CgogICAgLy8gVHLhuqMgduG7gSBu4bq/dSDEkcOjIGzGsHUgdHJvbmcgbWFwCiAgICBpZiAobWVtb1tpXS5jb3VudChqKSkgcmV0dXJuIG1lbW9baV1bal07CgogICAgLy8gR+G7jWkgxJHhu4cgcXV5OiBLaMO0bmcgY2jhu41uIEFbaS0xXSArIENo4buNbiBBW2ktMV0KICAgIGxvbmcgbG9uZyByZXMgPSBkcChpIC0gMSwgaik7CiAgICByZXMgPSAocmVzICsgZHAoaSAtIDEsIGogLyBBW2kgLSAxXSkpICUgTU9EOyAvLyBBW2ktMV0gZG8gdmVjdG9yIMSRw6FuaCBpbmRleCB04burIDAKCiAgICByZXR1cm4gbWVtb1tpXVtqXSA9IHJlczsKfQoKaW50IG1haW4oKSB7CiAgICAvLyBU4buRaSDGsHUgSS9PCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CgogICAgaW50IFE7CiAgICBsb25nIGxvbmcgTCwgUjsKICAgIGlmICghKGNpbiA+PiBRID4+IEwgPj4gUikpIHJldHVybiAwOwoKICAgIHdoaWxlIChRLS0pIHsKICAgICAgICBjaGFyIHR5cGU7CiAgICAgICAgbG9uZyBsb25nIHg7CiAgICAgICAgY2luID4+IHR5cGUgPj4geDsKCiAgICAgICAgLy8gWOG7rSBsw70gdGhhbyB0w6FjIFRow6ptIC8gWMOzYQogICAgICAgIGlmICh0eXBlID09ICcrJykgewogICAgICAgICAgICBpZiAoeCA9PSAxKSB7CiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEEucHVzaF9iYWNrKHgpOwogICAgICAgICAgICAgICAgc29ydChBLmJlZ2luKCksIEEuZW5kKCkpOyAvLyDEkOG6o20gYuG6o28gZMOjeSB0xINuZyBk4bqnbgogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICctJykgewogICAgICAgICAgICBpZiAoeCA9PSAxKSB7CiAgICAgICAgICAgICAgICBjbnQtLTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBmaW5kKEEuYmVnaW4oKSwgQS5lbmQoKSwgeCk7CiAgICAgICAgICAgICAgICBpZiAoaXQgIT0gQS5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgIEEuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpbnQgbiA9IEEuc2l6ZSgpOwogICAgICAgIAogICAgICAgIC8vIENsZWFyIG3huqNuZyBuaOG7myB0cuG6oW5nIHRow6FpIHRyxrDhu5tjIGtoaSDEkeG7hyBxdXkgbOG6oWkgdOG7qyDEkeG6p3UKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgbWVtb1tpXS5jbGVhcigpOwogICAgICAgIH0KCiAgICAgICAgLy8gVMOtbmgga+G6v3QgcXXhuqMgY2hvIMSRb+G6oW4gW0wsIFJdCiAgICAgICAgbG9uZyBsb25nIGFuc1IgPSBkcChuLCBSKTsKICAgICAgICBsb25nIGxvbmcgYW5zTCA9IChMID4gMSkgPyBkcChuLCBMIC0gMSkgOiAwOwoKICAgICAgICAvLyDDgXAgZOG7pW5nIGPDtG5nIHRo4bupYyBz4buRIGPDoWNoID0gKGRwKFIpIC0gZHAoTC0xKSkgKiAyXmNudAogICAgICAgIGxvbmcgbG9uZyBmaW5hbF9hbnMgPSAoYW5zUiAtIGFuc0wgKyBNT0QpICUgTU9EOwogICAgICAgIGZpbmFsX2FucyA9IChmaW5hbF9hbnMgKiBwb3dlcigyLCBjbnQpKSAlIE1PRDsKCiAgICAgICAgY291dCA8PCBmaW5hbF9hbnMgPDwgIlxuIjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==