//一个线段树题,把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; }