#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 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}; } using S = pair; std::pair crt(S lhs, S rhs) { auto && [r0, m0] = lhs; auto && [r1, m1] = rhs; if (r0 == 0 && m0 == 1) return {r1, m1}; if (r1 == 0 && m1 == 1) return {r0, m0}; if (m0 < m1) { std::swap(r0, r1); std::swap(m0, m1); } if (m1 == 0) return {0, 0}; if (m0 % m1 == 0) { if (r0 % m1 != r1) return {0, 0}; } 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 {r0, m0}; } pair e(){return {0, 1};} int main(){ ios::sync_with_stdio(false); cin.tie(0); int Q, cmd, cur = 0, k, m, r; cin >> Q; atcoder::segtree, crt, e> seg(Q); while(Q--){ cin >> cmd; if(cmd == 1){ cin >> m >> r; seg.set(cur++, make_pair(r, m)); }else if(cmd == 2){ cin >> k; cur -= k; }else{ cin >> m; auto pa = seg.prod(0, cur); if(pa.second == 0){ cout << "-1\n"; }else{ cout << pa.first % m << '\n'; } } } }