1 #include <algorithm>
2 #include <cstdio>
3
4 using namespace std;
5
6 const int N(100000+5);
7 int n,x,y,z,q;
8
9 #define lc (now<<1)
10 #define rc (now<<1|1)
11 #define mid (l+r>>1)
12 struct AC_Tree
13 {
14 int val[7],flag;
15 }tree[N<<2];
16 inline void pushup(int now)
17 {
18 for(int i=0;i<7;i++)
19 tree[now].val[i]=tree[lc].val[i]+tree[rc].val[i];
20 }
21 inline void pushdown(int now)
22 {
23 int temp[7],flag=tree[now].flag; tree[now].flag=0;
24 tree[lc].flag+=flag; tree[rc].flag+=flag;
25 for(int i=0;i<7;i++) temp[i]=tree[lc].val[i];
26 for(int i=0;i<7;i++) tree[lc].val[((i+flag)%7)]=temp[i];
27 for(int i=0;i<7;i++) temp[i]=tree[rc].val[i];
28 for(int i=0;i<7;i++) tree[rc].val[((i+flag)%7)]=temp[i];
29 }
30 void Build(int now,int l,int r)
31 {
32 if(l==r)
33 {
34 scanf("%d",&x);
35 tree[now].val[x%7]++;
36 return ;
37 }
38 Build(lc,l,mid);
39 Build(rc,mid+1,r);
40 pushup(now);
41 }
42 void Change(int now,int l,int r,int L,int R,int x)
43 {
44 if(l==L&&r==R)
45 {
46 int temp[7];
47 tree[now].flag+=x;
48 for(int i=0;i<7;i++) temp[i]=tree[now].val[i];
49 for(int i=0;i<7;i++) tree[now].val[(i+x)%7]=temp[i];
50 return ;
51 }
52 if(tree[now].flag) pushdown(now);
53 if(R<=mid) Change(lc,l,mid,L,R,x);
54 else if(L>mid) Change(rc,mid+1,r,L,R,x);
55 else Change(lc,l,mid,L,mid,x),Change(rc,mid+1,r,mid+1,R,x);
56 pushup(now);
57 }
58 int Query(int now,int l,int r,int L,int R)
59 {
60 if(l==L&&r==R) return tree[now].val[0];
61 if(tree[now].flag) pushdown(now);
62 if(R<=mid) return Query(lc,l,mid,L,R);
63 else if(L>mid) return Query(rc,mid+1,r,L,R);
64 else return Query(lc,l,mid,L,mid)+Query(rc,mid+1,r,mid+1,R);
65 }
66
67 int main()
68 {
69 scanf("%d",&n);
70 Build(1,1,n);
71 scanf("%d",&q);
72 for(char s[5];q--;)
73 {
74 scanf("%s%d%d",s,&x,&y);
75 if(s[0]==‘a‘)
76 {
77 scanf("%d",&z);
78 Change(1,1,n,x,y,z);
79 }
80 else printf("%d\n",Query(1,1,n,x,y));
81 }
82 return 0;
83 }