//一个线段树题,把k=1这种情况进行扩展,扩展到10就可以了;
代码如下:
#include<stdio.h>
#include<string.h>
struct node
{
int d[11];
}sum[210000];
void build(int i,int l,int r)
{
int j,mid;
for(j=1;j<=10;j++)
sum[i].d[j]=0;
if(l==r)return;
else
{
mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
}
void update(int i,int l,int r,int a,int b,int c,int k)
{
int mid,s,t;
if(a>b)return;
if(l==a&&b==r)
sum[i].d[k]+=c;
else
{
mid=(l+r)>>1;
if(b<=mid)
update(i<<1,l,mid,a,b,c,k);
else if(b>mid&&a<=mid)
{
update(i<<1,l,mid,a,mid,c,k);
s=mid+1;
t=(s-a)%k;
if(t!=0)s+=k-t;
if(s<=b)
update(i<<1|1,mid+1,r,s,b,c,k);
}
else update(i<<1|1,mid+1,r,a,b,c,k);
}
}
int query(int i,int l,int r,int p,int k)
{
int mid,ans=0;
if(l==r)
return sum[i].d[k];
else
{
mid=(l+r)>>1;
if((p-l)%k==0)
ans=sum[i].d[k];
if(p<=mid)
return ans+query(i<<1,l,mid,p,k);
else
return ans+query(i<<1|1,mid+1,r,p,k);
}
}
int num[60000];
int main()
{
int n,m,i,op,a,b,c,k,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
scanf("%d",&m);
build(1,1,n);
while(m--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d%d",&a,&b,&k,&c);
update(1,1,n,a,b,c,k);
}
else
{
scanf("%d",&a);b=0;
for(j=1;j<=10;j++)
b+=query(1,1,n,a,j);
printf("%d\n",b+num[a]);
}
}
}
return 0;
}