#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using Int = long long; template ostream &operator<<(ostream &os, const pair &a) { return os << "(" << a.first << ", " << a.second << ")"; }; template ostream &operator<<(ostream &os, const vector &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; } template void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; } template bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; } template bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; } #define COLOR(s) ("\x1b[" s "m") // a x + b y = (+/-) gcd(a, b) // (a, 0): g = a, x = 1, y = 0 // (0, b), (b, b), (-b, b) (b != 0): g = b, x = 0, y = 1 // otherwise: 2 |x| <= |b|, 2 |y| <= |a| // S: signed integer template S gojo(S a, S b, S &x, S &y) { if (b != 0) { const S g = gojo(b, a % b, y, x); y -= (a / b) * x; return g; } else { x = 1; y = 0; return a; } } vector M, B; // x0 + m0 x1 + m0 m1 x2 + ... // no sol <=> ms.back() = 0 vector ms, xs; void init() { M.clear(); B.clear(); ms.clear(); xs.clear(); } Int get(Int m) { if (ms.size() && !ms.back()) { return -1; } Int x = 0; for (int i = (int)ms.size(); --i >= 0; ) { ((x *= ms[i]) += xs[i]) %= m; } return x; } void push(Int m, Int b) { M.push_back(m); B.push_back(b); if (ms.size() && !ms.back()) { ms.push_back(0); xs.push_back(0); return; } // x + a y == b (mod m) Int a = 1; for (int i = (int)ms.size(); --i >= 0; ) (a *= ms[i]) %= m; Int s, t; const Int g = gojo(a, m, s, t); const Int x = get(m); if ((b - x) % g != 0) { ms.push_back(0); xs.push_back(0); return; } m /= g; Int y = ((b - x) / g * s) % m; if (y < 0) y += m; ms.push_back(m); xs.push_back(y); } void pop() { M.pop_back(); B.pop_back(); ms.pop_back(); xs.pop_back(); } int main() { int Q; for (; ~scanf("%d", &Q); ) { init(); for (; Q--; ) { int O; scanf("%d", &O); if (O == 1) { Int m, b; scanf("%lld%lld", &m, &b); push(m, b); } else if (O == 2) { int K; scanf("%d", &K); for (; K--; ) pop(); } else if (O == 3) { Int m; scanf("%lld", &m); const Int ans = get(m); printf("%lld\n", ans); } else { assert(false); } // cerr<<"M = "<