2012 ACM/ICPC Asia Regional Changchun Online A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267
思路:树状数组更新。

#include<stdio.h> #include<string.h> #include<iostream> #define lowbit(x) (x)&(-x) using namespace std; const int maxn = 50005; int sum[maxn][11][11],n; int as[maxn]; void add(int x,int c,int k,int md) { for(; x <= n; x += lowbit(x)) sum[x][k][md] += c; } int getsum(int x) { int ans = 0; int i,b = x; for(;x;x-=lowbit(x)){ for(i = 1; i <= 10; ++ i) ans += sum[x][i][b%i]; } return ans; } int main() { int i,j,k,m; while(scanf("%d",&n)==1) { for(i = 1; i <= n; ++ i) for(j = 0; j <= 10; ++ j) for(k = 0; k <= 10; ++ k) sum[i][j][k] = 0; for(i = 1; i <= n; ++ i) scanf("%d",as+i); scanf("%d",&m); while(m--) { int a,b,c,k; scanf("%d",&i); if(i==1){ scanf("%d %d %d %d",&a,&b,&k,&c); add(a,c,k,a%k); add(b+1,-c,k,a%k); }else{ scanf("%d",&k); c = getsum(k) + as[k]; printf("%d\n",c); } } }return 0; }