#include #include #include using namespace std; using i64 = int64_t; i64 inv_mod(i64 x, i64 m) { x %= m; if (x < 0) x += m; i64 a = m, b = x; i64 u = 0, v = 1; while (b > 0) { i64 q = a / b; swap(a -= q * b, b); swap(u -= q * v, v); } if (u < 0) u += m / a; return 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 { i64 p = 1, g = 1, y = r % m; for (int i = 0; i < (int)Y.size(); i++) { y -= Y[i] * p % m; if (y < 0) y += m; p = p * M[i] % m; g = gcd(g * M[i], m); } if (y % g != 0) { M.push_back(1), Y.push_back(-1); } else { m /= g; y = m == 1 ? 0 : (y / g) * inv_mod(p / g, m) % m; M.push_back(m), Y.push_back(y); } } } else if (t == 2) { int k; cin >> k; while (k--) M.pop_back(), Y.pop_back(); } else { int m; cin >> m; if (!Y.empty() && Y.back() < 0) cout << -1 << "\n"; else { i64 x = 0; for (int i = (int)Y.size() - 1; i >= 0; i--) x = (x * M[i] + Y[i]) % m; cout << x << "\n"; } } } }