您的位置:首页 > 其它

HDU 4267 A Simple Problem with Integers [树状数组]

2012-09-10 22:00 344 查看
  根据%k=a中a和k的不同组合建立55棵树状数组,每次修改操作只对其中1棵树状数组进行操作,每次查询对其中10棵树状数组统计增量和。

#include <string.h>
#include <stdio.h>
#define MAXN 50005
int n,q,x[MAXN];
int ta,tb,cc,k,op;
int c[55][MAXN];
inline void update(int *c,int x,int d){while(x<=n)c[x]+=d,x+=x&-x;}
inline int query(int *c,int x){int ret=0;while(x)ret+=c[x],x-=x&-x;return ret;}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)scanf("%d",&x[i]);
for(int i=0;i<55;i++)memset(c[i],0,4*n+4);
scanf("%d",&q);
while(q--){
scanf("%d",&op);
if(op==1){
scanf("%d%d%d%d",&ta,&tb,&k,&cc);
update(c[(k*(k-1)>>1)+ta%k],ta,cc);
update(c[(k*(k-1)>>1)+ta%k],tb+1,-cc);
}else{
scanf("%d",&cc);
int ans=0;
for(int i=1;i<=10;i++)ans+=query(c[(i*(i-1)>>1)+cc%i],cc);
printf("%d\n",x[cc]+ans);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: