#include using namespace std; typedef signed long long ll; #define _P(...) (void)printf(__VA_ARGS__) #define FOR(x,to) for(x=0;x<(to);x++) #define FORR(x,arr) for(auto& x:arr) #define FORR2(x,y,arr) for(auto& [x,y]:arr) #define ALL(a) (a.begin()),(a.end()) #define ZERO(a) memset(a,0,sizeof(a)) #define MINUS(a) memset(a,0xff,sizeof(a)) template bool chmax(T &a, const T &b) { if(a bool chmin(T &a, const T &b) { if(a>b){a=b;return 1;}return 0;} //------------------------------------------------------- template V ext_gcd(V p,V q,V& x, V& y) { // get px+qy=gcd(p,q) if(q==0) return x=1,y=0,p; V g=ext_gcd(q,p%q,y,x); y-=p/q*x; return g; } template pair rev(V p,V m) { // get p*b=a=gcd(p,m) mod m となる(a,b) ll g=gcd(p,m),a,b; p/=g, m/=g; assert(ext_gcd(p,m,a,b)==1); a=(a+m)%m; return {g,a}; } int Q; vector M,Y; void solve() { int i,j,k,l,r,x,y; string s; cin>>Q; while(Q--) { cin>>i; if(i==1) { ll m,r; cin>>m>>r; if(!M.empty()&&M.back()==0) { M.push_back(0); Y.push_back(0); continue; } ll g=1,y=r; FOR(i,M.size()) { y=(y+m-Y[i]*g%m)%m; g=g*M[i]%m; } auto pp=rev(g,m); if(y%pp.first) { M.push_back(0); Y.push_back(0); } else { m/=pp.first; y/=pp.first; M.push_back(m); Y.push_back(y*pp.second%m); } } else if(i==2) { cin>>x; FOR(i,x) { M.pop_back(); Y.pop_back(); } } else { ll m; cin>>m; if(M.empty()) { cout<<0<=0;i--) ret=(ret*M[i]+Y[i])%m; cout<