#include #include using namespace std; using ll = long long; pair inv_mod(ll x, ll m) { ll a = m, b = x % m; if (b < 0) b += m; ll u = 0, v = 1; while (b > 0) { ll q = a / b; swap(a -= q * b, b); swap(u -= q * v, v); } if (u < 0) u += m / a; return {a, u}; } int main() { int q; cin >> q; vector M, Y; while (q--) { int t; cin >> t; if (t == 1) { int m, r; cin >> m >> r; if (!Y.empty() && Y.back() < 0) M.push_back(m), Y.push_back(-1); else { ll p = 1, y = r; for (int i = 0; i < (int)Y.size(); i++) { y -= Y[i] * p % m; if (y < 0) y += m; p = p * M[i] % m; } auto [g, x] = inv_mod(p, m); if (y % g != 0) { M.push_back(1), Y.push_back(-1); } else { m /= g; M.push_back(m); Y.push_back((y / g) * x % m); } } } else if (t == 2) { int k; cin >> k; while (k--) M.pop_back(), Y.pop_back(); } else { int m; cin >> m; ll x = 0; if (!Y.empty() && Y.back() < 0) { x = -1; } else { for (int i = (int)Y.size() - 1; i >= 0; i--) x = (x * M[i] + Y[i]) % m; } cout << x << "\n"; } } }