郁闷死了,做了两天了,
(i-a)%k==0,可以转化为i%k==a%k;ORZ...
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<vector>
using namespace std;
const int N=50010;
int sum[N<<2][55];
int col[N<<2],res[N];
#define lson l,mid, rt << 1
#define rson mid+1,r,rt << 1 | 1
int mod,LL;
int shunxu[11][11];
void PushDown(int rt)
{
if(col[rt])
{
col[rt<<1] += col[rt];
col[rt<<1|1] += col[rt];
col[rt]=0;
for(int i=0;i<55;i++){
sum[rt<<1][i] += sum[rt][i];
sum[rt<<1|1][i] += sum[rt][i] ;
sum[rt][i]=0;
}
}
}
void build(int l,int r,int rt)
{
col[rt]=0;
memset(sum[rt],0,sizeof(sum[rt]));
if(l==r)
return;
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void update(int L,int R,int val,int l,int r,int rt)
{
if(l==L&&r==R)
{
col[rt]+=val;
sum[rt][shunxu[mod][LL%mod]]+=val;
return ;
}
PushDown(rt);
int mid=(l+r)>>1;
if(R<=mid)update(L,R,val,lson);
else if(L>mid)update(L,R,val,rson);
else {
update(L,mid,val,lson);
update(mid+1,R,val,rson);
}
}
int query(int l,int r,int rt,int m)
{
if(l==r)
{
int d=0;
for(int i=1;i<=10;i++)
d += sum[rt][shunxu[i][m%i]];
return d+res[l];
}
int mid=(l+r)>>1;
PushDown(rt);
if(m<=mid)
return query(lson,m);
else return query(rson,m);
}
int main()
{
int n,q,cc=0;
for(int i=1;i<=10;i++)
for(int j=0;j<i;j++)
shunxu[i][j]=cc++;
while(~scanf("%d",&n))
{
build(1,n,1);
int q;
for(int i=1;i<=n;i++)
scanf("%d",&res[i]);
scanf("%d",&q);
int kk,aa,RR,k,val;
while(q--)
{
scanf("%d",&kk);
if(kk==2)
{
scanf("%d",&aa);
printf("%d\n",query(1,n,1,aa));
} else if(kk==1)
{
scanf("%d%d%d%d",&LL,&RR,&mod,&val);
update(LL,RR,val,1,n,1);
}
}
}
return 0;
}