#include using namespace std; #include #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 crt(Bint r0, int r1, Bint m0, int m1) { if (r0 == 0 && m0 == 1) return {r1, m1}; if (m0 == 0) return {0, 0}; if (m0 < m1){ if (m1 % m0 == 0) { if (r1 % m0 != r0) return {0, 0}; } }else{ if (m0 % m1 == 0) { if (r0 % m1 != r1) return {0, 0}; } } int g, im; std::tie(g, im) = atcoder::internal::inv_gcd((int)(m0 % m1), m1); int u1 = (m1 / g); if ((r1 - r0) % g) return {0, 0}; int x = (int)((r1 - r0) / g % u1 * im % u1); return {x, 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; if(R < 0) R += M; } }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; R = safe_mod(R, M); } stk.pop_back(); } }else{ cin >> m; if(stk.back().second == 0){ cout << "-1\n"; }else{ cout << R % m << '\n'; } } } }