#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つの素因数分解 vector fact(ll n){ vector res; for(int i = 2; (ll)i * i <= n;){ if(n % i == 0){ res.push_back(i); n /= i; continue; } ++i; } if(n > 1) res.push_back(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); a.push_back(-1); //番兵 int mod = 1; M.push_back(vi()); for(int j = 0; j < a.size() - 1; ++j){ mod *= a[j]; if(a[j] != a[j + 1]){ if(mp.count(a[j])){ auto [oldr, oldmod] = mp[a[j]].back(); int p = min(mod, oldmod); if(oldr % p != r % p){ //矛盾するため解なし if(is == 0) is = M.size(); }else if(mod > oldmod){ //制約が厳しい方に更新する mp[a[j]].push_back({r % mod, mod}); M.back().push_back(a[j]); } }else{ mp[a[j]].push_back({r, mod}); M.back().push_back(a[j]); } mod = 1; } } }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 */