#include using namespace std; using ll = long long; using ld = long double; template using v = vector; template using vv = vector>; template using vvv = vector>>; #define rep(...) overload_rep(__VA_ARGS__, rep3, rep2)(__VA_ARGS__) #define overload_rep(_1, _2, _3, name, ...) name #define rep2(i, n) for (int i = 0; i < (int)(n); i++) #define rep3(i, a, b) for (int i = (int)(a); i < (int)(b); i++) #define rrep(i,n) for(int i=(int)(n)-1;i>=0;i--) #define all(x) (x).begin(), (x).end() #define vi vector #define vll vector #define vvi vector> #define vvll vector> #define vvvi vector>> #define pii pair #define pll pair #define el '\n' #define sp ' ' #define Yes cout<<"Yes"< bool chmin(T &a, const T &b){ if (b < a){ a = b; return true; } return false; } template bool chmax(T &a, const T &b){ if (b > a){ a = b; return true; } return false; } using mtup = tuple; const int INF = 1e9; const long long LINF = 1e18; //const int mod = 998244353; const int mod = 1e9 + 7; ll extgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll x1, y1; ll g = extgcd(b, a % b, x1, y1); x = y1; y = x1 - (a / b) * y1; return g; } ll mod_inv(ll a, ll mod) { ll x, y; extgcd(a, mod, x, y); x %= mod; if (x < 0) x += mod; return x; } //解が大きくなりmodで割った余りを出力するとき // x % mi = ai をすべて満たす最小の x % modを返す int CRT(vector& a, vector&m, int mod){ int n = a.size(); vector c(n); for(int i = 0; i < n; ++i){ int xi = 0, Mi = 1; for(int j = 0; j < i; ++j){ xi = (xi + (ll)c[j] * Mi) % m[i]; Mi = (ll)Mi * m[j] % m[i]; } c[i] = (ll)(a[i] - xi) * mod_inv(Mi, m[i]) % m[i]; c[i] = (c[i] + m[i]) % m[i]; } //x = c0 + c1m0 + c2m0m1 +... int M = 1, res = 0; for(int i = n - 1; i >= 0; --i){ res = ((ll)res * m[i] % mod + c[i]) % mod; } return res; } //1つの素因数分解 v fact(int n){ v res; for(int i = 2; i * i <= n;){ int r = 1; while(n % i == 0){ n /= i; r *= i; } res.push_back({i, r}); ++i; } if(n > 1) res.push_back({n, n}); return res; } int main(){ //高速化 //ここから int q; cin >> q; map>> mp; int is = 0; vvi M; rep(i, q){ int com, m, k, r; cin >> com; if(com == 1){ cin >> m >> r; auto a = fact(m); M.push_back(vi()); for(auto &[ai, mod]: a){ if(mp.count(ai)){ auto [oldr, oldmod] = mp[ai].back(); int p = min(mod, oldmod); if(oldr % p != r % p){ //矛盾するため解なし if(is == 0) is = M.size(); }else if(mod > oldmod){ //制約が厳しい方に更新する mp[ai].push_back({r % mod, mod}); M.back().push_back(ai); } }else{ mp[ai].push_back({r, mod}); M.back().push_back(ai); } } }else if(com == 2){ cin >> k; rep(j, k){ for(auto mod: M.back()){ mp[mod].pop_back(); if(mp[mod].empty()) mp.erase(mod); } M.pop_back(); } if(is > M.size()) is = 0; }else{ cin >> m; if(is != 0){ cout << -1 << el; continue; } vector a, md; for(auto &[key, vl]:mp){ auto tmp = vl.back(); a.push_back(tmp.first); md.push_back(tmp.second); } cout << CRT(a, md, m) << el; } } } /* cppt cppt_ge seg, bit, uf g++ main.cpp -O2 -std=c++17 ./a.out */