#include using namespace std; #include using Bint = boost::multiprecision::cpp_int; Bint safe_mod(Bint x, Bint m) { x %= m; if (x < 0) x += m; return x; } std::pair inv_gcd(Bint a, Bint b) { a = safe_mod(a, b); if (a == 0) return {b, 0}; Bint s = b, t = a; Bint m0 = 0, m1 = 1; while (t) { Bint u = s / t; s -= t * u; m0 -= m1 * u; auto tmp = s; s = t; t = tmp; tmp = m0; m0 = m1; m1 = tmp; } if (m0 < 0) m0 += b / s; return {s, m0}; } std::pair crt(Bint r0, Bint r1, Bint m0, Bint m1) { if (r0 == 0 && m0 == 1) return {(int)(r1), (int)(m1)}; if (m0 == 0) return {0, 0}; bool flg = false; if (m0 < m1) { flg = true; std::swap(r0, r1); std::swap(m0, m1); } if (m0 % m1 == 0) { if (r0 % m1 != r1) return {0, 0}; } if(flg){ std::swap(r0, r1); std::swap(m0, m1); } Bint g, im; std::tie(g, im) = inv_gcd(m0, m1); Bint u1 = (m1 / g); if ((r1 - r0) % g) return {0, 0}; Bint x = (r1 - r0) / g % u1 * im % u1; r0 += x * m0; m0 *= u1; if (r0 < 0) r0 += m0; return {(int)(x), (int)(u1)}; } int main(){ ios::sync_with_stdio(false); cin.tie(0); vector> stk; stk.emplace_back(0, 1); Bint R = 0, M = 1; int Q, cmd, k, m, r; cin >> Q; while(Q--){ cin >> cmd; if(cmd == 1){ cin >> m >> r; if(stk.back().second == 0){ stk.emplace_back(0, 0); continue; } stk.emplace_back(crt(R, r, M, m)); if(stk.back().second != 0){ R += stk.back().first * M; M *= stk.back().second; } }else if(cmd == 2){ cin >> k; for(int i = 0; i < k; i++){ if(stk.back().second != 0){ M /= stk.back().second; R -= stk.back().first * M; } stk.pop_back(); } }else{ cin >> m; if(stk.back().second == 0){ cout << "-1\n"; }else{ cout << R % m << '\n'; } } } }