1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 using namespace std;
6 #define mod 19961993
7 #define N 100005
8 int n;
9 int PHI[65]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281};
10 long long ny[65];
11 int read() {
12 int s=0,f=1;
13 char ch=getchar();
14 for( ; ch<‘0‘||ch>‘9‘; f=(ch==‘-‘)?-1:f,ch=getchar()) ;
15 for( ; ch>=‘0‘&&ch<=‘9‘; s=s*10+(ch^48),ch=getchar()) ;
16 return s*f;
17 }
18 long long qpow(long long x,int t) {
19 long long ans=1;
20 for( ; t; t>>=1,x=(x*x)%mod) if(t&1) ans=(ans*x)%mod;
21 return ans%mod;
22 }
23 struct TREE {
24 long long val,phi;
25 } tree[4*N];
26 void pushup(int rt) {
27 tree[rt].val=tree[rt<<1].val*tree[rt<<1|1].val%mod;
28 tree[rt].phi=tree[rt<<1].phi|tree[rt<<1|1].phi;
29 }
30 void build(int rt,int l,int r) {
31 if(l==r) {
32 tree[rt].val=3;
33 tree[rt].phi=0;
34 for(int i=0; i<60; ++i) if(!(tree[rt].val%PHI[i])) tree[rt].phi|=(1ll<<i);
35 return ;
36 }
37 int mid=l+r>>1;
38 build(rt<<1,l,mid),build(rt<<1|1,mid+1,r);
39 pushup(rt);
40 }
41 void update(int rt,int pos,int l,int r,int val) {
42 if(l==r) {
43 tree[rt].val=val;
44 tree[rt].phi=0;
45 for(int i=0; i<60; ++i) if(!(tree[rt].val%PHI[i])) tree[rt].phi|=(1ll<<i);
46 return ;
47 }
48 int mid=l+r>>1;
49 if(pos<=mid) update(rt<<1,pos,l,mid,val);
50 else update(rt<<1|1,pos,mid+1,r,val);
51 pushup(rt);
52 }
53 TREE query(int rt,int L,int R,int l,int r) {
54 if(L<=l&&r<=R) return tree[rt];
55 int mid=l+r>>1;
56 TREE now,tmp;
57 now.val=1ll,now.phi=0;
58 if(L<=mid) {
59 tmp=query(rt<<1,L,R,l,mid);
60 now.val=now.val*tmp.val%mod;
61 now.phi|=tmp.phi;
62 }
63 if(mid<R) {
64 tmp=query(rt<<1|1,L,R,mid+1,r);
65 now.val=now.val*tmp.val%mod;
66 now.phi|=tmp.phi;
67 }
68 return now;
69 }
70 signed main() {
71 build(1,1,N-5);
72 for(int i=0; i<60; ++i) ny[i]=qpow(PHI[i],mod-2);
73 n=read();
74 for(int opt,a,b,T=1; T<=n; ++T) {
75 opt=read();
76 a=read(),b=read();
77 if(opt) update(1,a,1,N-5,b);
78 else {
79 TREE now=query(1,a,b,1,N-5);
80 long long ans=now.val;
81 for(int j=0; j<60; ++j) {
82 if(now.phi&(long long)(1ll<<(long long)j)) {
83 ans=ans*(PHI[j]-1)%mod*ny[j]%mod;
84 }
85 } printf("%lld\n",ans);
86 }
87 } return 0;
88 }