线段树水题。我是ziliuziliu,我是最强的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100500
using namespace std;
int n,a[maxn],m;
int sum[maxn<<2][8],lazy[maxn<<2],tot=0,root,ls[maxn<<2],rs[maxn<<2];
int aa,bb,x;
char type[5];
void pushup(int now)
{
for (int i=0;i<=6;i++)
sum[now][i]=sum[ls[now]][i]+sum[rs[now]][i];
}
void pushdown(int now)
{
if (lazy[now]==0) return;
int regis[10];
for (int i=0;i<=6;i++) regis[i]=sum[ls[now]][i];
for (int i=0;i<=6;i++) sum[ls[now]][(i+lazy[now])%7]=regis[i];
for (int i=0;i<=6;i++) regis[i]=sum[rs[now]][i];
for (int i=0;i<=6;i++) sum[rs[now]][(i+lazy[now])%7]=regis[i];
lazy[ls[now]]+=lazy[now];lazy[rs[now]]+=lazy[now];
lazy[now]=0;
}
void build(int &now,int left,int right)
{
now=++tot;lazy[now]=0;
if (left==right)
{
sum[now][a[left]%7]++;
return;
}
int mid=(left+right)>>1;
build(ls[now],left,mid);
build(rs[now],mid+1,right);
pushup(now);
}
void modify(int now,int left,int right,int l,int r,int x)
{
pushdown(now);
if ((left==l) && (right==r))
{
lazy[now]+=x;
int regis[10];
for (int i=0;i<=6;i++) regis[i]=sum[now][i];
for (int i=0;i<=6;i++) sum[now][(i+x)%7]=regis[i];
return;
}
int mid=(left+right)>>1;
if (r<=mid) modify(ls[now],left,mid,l,r,x);
else if (l>=mid+1) modify(rs[now],mid+1,right,l,r,x);
else
{
modify(ls[now],left,mid,l,mid,x);
modify(rs[now],mid+1,right,mid+1,r,x);
}
pushup(now);
}
int ask(int now,int left,int right,int l,int r)
{
pushdown(now);
if ((left==l) && (right==r))
return sum[now][0];
int mid=(left+right)>>1;
if (r<=mid) return ask(ls[now],left,mid,l,r);
else if (l>=mid+1) return ask(rs[now],mid+1,right,l,r);
else return ask(ls[now],left,mid,l,mid)+ask(rs[now],mid+1,right,mid+1,r);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(root,1,n);
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%s",type);
if (type[0]=='a')
{
scanf("%d%d%d",&aa,&bb,&x);
modify(root,1,n,aa,bb,x);
}
else
{
scanf("%d%d",&aa,&bb);
printf("%d
",ask(root,1,n,aa,bb));
}
}
return 0;
}