#include<cstdio>
#include<cstring>
using namespace std;
struct h{
int l, r, x[8], val;
}tree[270000];
int a, b, m;
char c[22];
void built(int d, int l, int r)
{
tree[d].l=l;
tree[d].r=r;
tree[d].val=0;
for(int i=0;i<7;i++) tree[d].x[i]=0;
if(l==r)
{
int v;
scanf("%d", &v);
tree[d].x[v%7]=1;
return;
}
int mid=(l+r)/2;
built(d*2,l,mid);
built(1+d*2,mid+1,r);
for(int i=0;i<7;i++)
tree[d].x[i]=tree[2*d].x[i]+tree[2*d+1].x[i];
}
void pushdown(int d, int l, int r)
{
int t=tree[d].val;
tree[d*2].val+=t;
tree[d*2+1].val+=t;
int mid=(l+r)/2;
int lx[7], rx[7];
for(int i=0;i<7;i++)
{
lx[(i+t)%7]=tree[d*2].x[i];
rx[(i+t)%7]=tree[d*2+1].x[i];
}
for(int i=0;i<7;i++)
{
tree[d*2].x[i]=lx[i];
tree[d*2+1].x[i]=rx[i];
}
tree[d].val=0;
return;
}
void update(int d, int l, int r)
{
if(a<=l&&r<=b)
{
int tx[7];
for(int i=0;i<7;i++) tx[(i+m)%7]=tree[d].x[i];
for(int i=0;i<7;i++) tree[d].x[i]=tx[i];
tree[d].val+=m;
return;
}
if(tree[d].val) pushdown(d,l,r);
int mid=(l+r)/2;
if(a<=mid) update(d*2,l,mid);
if(b>mid) update(d*2+1,mid+1,r);
for(int i=0;i<7;i++)
tree[d].x[i]=tree[2*d].x[i]+tree[2*d+1].x[i];
}
long long sear(int d, int l, int r)
{
if(l>=a&&r<=b) return tree[d].x[0];
if(tree[d].val) pushdown(d,l,r);
int mid=(l+r)/2;
if(a>mid) return sear(d*2+1,mid+1,r);
else if(b<=mid) return sear(d*2,l,mid);
else return sear(d*2,l,mid)+sear(d*2+1,mid+1,r);
}
int main()
{
int n, q;
scanf("%d", &n);
built(1,1,n);
scanf("%d", &q);
for(int i=0;i<q;i++)
{
scanf("%s", &c);
if(c[0]=='a')
{
scanf("%d %d %d", &a, &b, &m);
update(1,1,n);
}
else
{
scanf("%d %d", &a, &b);
printf("%d\n", sear(1,1,n));
}
}
return 0;
}
线段树练习4
最新推荐文章于 2021-10-14 23:16:59 发布