#include #include #include using namespace std; #include using mint = atcoder::modint; int main() { int q; cin >> q; vector M{1}, Y{0}; while (q--) { int t; cin >> t; if (t == 1) { int m, r; cin >> m >> r; if (Y.back() < 0) M.push_back(m), Y.push_back(-1); else { mint::set_mod(m); mint p = 1, y = r; for (auto [m_, y_] : views::zip(M, Y)) y -= y_ * p, p *= m_; auto [g, x] = atcoder::internal::inv_gcd(p.val(), m); if (y.val() % g != 0) { M.push_back(1), Y.push_back(-1); } else { m /= g; M.push_back(m); Y.push_back((y.val() / g) * x % m); } } } else if (t == 2) { int k; cin >> k; while (k--) M.pop_back(), Y.pop_back(); } else { int m; cin >> m; if (Y.back() < 0) { cout << -1 << "\n"; } else { mint::set_mod(m); mint x = 0; for (auto [m_, y_] : views::zip(M, Y) | views::reverse) x = x * m_ + y_; cout << x.val() << "\n"; } } } }