1 #include<iostream>
2 #include<string>
3 #include<algorithm>
4 #include<cstdio>
5 #include<cstring>
6 #include<cstdlib>
7 #include<cmath>
8 #include<map>
9 using namespace std;
10 typedef long long s64;
11
12 const int ONE=200001;
13 const s64 Niyu=5e8+4;
14 const int MOD=1e9+7;
15
16 int n,T;
17 int a[ONE*2];
18 char ch[ONE];
19 int Q;
20 s64 x,y;
21 s64 x_orig,y_orig,x_bloc,y_bloc,diff;
22 s64 A,A_i;
23
24 struct power
25 {
26 int len;
27
28 struct point
29 {
30 s64 val,val_i;
31 friend point operator +(point a,point b)
32 {
33 a.val=(a.val + b.val)%MOD;
34 a.val_i=(a.val_i + b.val_i) % MOD;
35 return a;
36 }
37 }odd,eve;
38
39 friend power operator +(power a,power b)
40 {
41 power c;
42 c.len = a.len+b.len;
43 if(a.len%2)
44 {
45 c.odd = a.odd+b.eve;
46 c.eve = a.eve+b.odd;
47 }
48 else
49 {
50 c.odd = a.odd+b.odd;
51 c.eve = a.eve+b.eve;
52 }
53 return c;
54 }
55 }Node[ONE*10],ZERO;
56
57 s64 get()
58 {
59 s64 res=1,Q=1;char c;
60 while( (c=getchar())<48 || c>57 )
61 if(c==‘-‘)Q=-1;
62 if(Q) res=c-48;
63 while( (c=getchar())>=48 && c<=57 )
64 res=res*10+c-48;
65 return res*Q;
66 }
67
68 void Build(int i,int l,int r)
69 {
70 if(l==r)
71 {
72 Node[i].len = 1;
73 Node[i].odd.val = a[l];
74 Node[i].odd.val_i = a[l]*l % MOD;
75 return;
76 }
77
78 int mid=(l+r)/2;
79 Build(i*2,l,mid); Build(i*2+1,mid+1,r);
80
81 Node[i] = Node[i*2] + Node[i*2+1];
82 }
83
84 void Update(int i,int l,int r,int L,int x)
85 {
86 if(L==l && l==r)
87 {
88 Node[i].odd.val = x;
89 Node[i].odd.val_i = x*l % MOD;
90 Node[i].eve.val = Node[i].eve.val_i = 0;
91 return;
92 }
93
94 int mid=(l+r)/2;
95 if(L<=mid) Update(i*2,l,mid,L,x);
96 else Update(i*2+1,mid+1,r,L,x);
97
98 Node[i] = Node[i*2] + Node[i*2+1];
99 }
100
101 power Query(int i,int l,int r,int L,int R)
102 {
103 if(L>R) return ZERO;
104 if(L<=l && r<=R) return Node[i];
105
106 int mid=(l+r)/2;
107 if(R<=mid) return Query(i*2,l,mid,L,R);
108 if(mid+1<=L) return Query(i*2+1,mid+1,r,L,R);
109 return Query(i*2,l,mid,L,R) + Query(i*2+1,mid+1,r,L,R);
110 }
111
112 s64 HE(s64 a,s64 b)
113 {
114 a--; b--;
115 if(a==b) return 1;
116 if(a>b) return 0;
117 s64 x=(b-a+1) % MOD;
118 return (s64)(a+b)%MOD*x%MOD * Niyu % MOD;
119 }
120
121 int main()
122 {
123 ZERO.len=1; ZERO.odd.val=ZERO.odd.val_i=ZERO.eve.val=ZERO.eve.val_i=0;
124
125 n=get();
126 scanf("%s",ch+1);
127 for(int i=1;i<=n;i++) a[i]=ch[i]-‘0‘;
128 for(int i=1;i<=n;i++) a[i+n]=a[i];
129 n*=2; Build(1,1,n);
130
131 T=get();
132 while(T--)
133 {
134 Q=get();
135 if(Q==1)
136 {
137 x=get(); y=get();
138 Update(1,1,n,x,y);
139 Update(1,1,n,x+n/2,y);
140 }
141 else
142 {
143 x=get(); y=get();
144 x_orig=(x-1)%n+1; y_orig=(y-1)%n+1;
145 x_bloc=(x-1)/n+1; y_bloc=(y-1)/n+1;
146
147 diff = y_bloc-x_bloc-1; diff%=MOD;
148 if(diff!=-1)
149 {
150 if(x%2)
151 {
152 power res_l = Query(1,1,n, x_orig,n);
153 power res_r = Query(1,1,n, 1,y_orig);
154 power res_mid = Query(1,1,n, 1,n);
155
156 A =( res_l.odd.val + res_r.odd.val + res_mid.odd.val * diff % MOD ) % MOD;
157 A_i=0;
158
159 A_i += (res_l.odd.val_i + (s64)res_l.odd.val * (x_bloc-1)%MOD * n % MOD)%MOD; A_i%=MOD;
160 A_i += (res_r.odd.val_i + (s64)res_r.odd.val * (y_bloc-1)%MOD * n % MOD)%MOD; A_i%=MOD;
161
162 A_i += (diff*res_mid.odd.val_i%MOD + (s64)res_mid.odd.val * n % MOD * HE(x_bloc+1,y_bloc-1)%MOD)%MOD;
163 A_i%=MOD;
164 }
165 else
166 {
167 power res_l = Query(1,1,n, x_orig,n);
168 power res_r = Query(1,1,n, 2,y_orig);
169 power res_mid = Query(1,1,n, 2,n);
170
171 A =( res_l.odd.val + res_r.odd.val + res_mid.odd.val * diff % MOD ) % MOD;
172 A_i=0;
173
174 A_i += (res_l.odd.val_i + (s64)res_l.odd.val * (x_bloc-1)%MOD * n % MOD)%MOD; A_i%=MOD;
175 A_i += (res_r.odd.val_i + (s64)res_r.odd.val * (y_bloc-1)%MOD * n % MOD)%MOD; A_i%=MOD;
176
177 A_i += (diff*res_mid.odd.val_i%MOD + (s64)res_mid.odd.val * n % MOD * HE(x_bloc+1,y_bloc-1)%MOD)%MOD;
178 A_i%=MOD;
179 }
180 }
181 else
182 {
183 power res = Query(1,1,n, x_orig,y_orig);
184 A = res.odd.val;
185 A_i=0;
186 A_i += (s64)(res.odd.val_i + A * (x_bloc-1)%MOD * n % MOD) % MOD; A_i%=MOD;
187 }
188 printf("%lld\n", (s64)(A * (y%MOD+1) % MOD - A_i + MOD) % MOD);
189 }
190 }
191
192 }