题目大意:给你N个数,两种操作
1 a b k c: 表示对区间[a,b]内的所有满足(i - a) % k == 0的数加上c
2 a:第a个数是多少
解题思路:三维数组,bit[i][k][j]表示第i个数,间隔为k,余数为j(因为要修改的是[a,b]区间中,所有满足间隔为k,且余数为a % k的所有数),所以用三维数组就可以全部区分出来了
每次修改的时候,只需要modify(a, k, a % k, c)和modify(b + 1, k, a % k, -c)
询问的时候就找出每种间隔的情况进行相加即可
#include <cstdio>
#include <cstring>
const int N = 50010;
int bit[N][11][11];
int val[N];
int n;
void init() {
for (int i = 1; i <= n; i++)
scanf("%d", &val[i]);
memset(bit, 0, sizeof(bit));
}
inline int lowbit(int x) {
return x & (-x);
}
void Modify(int x, int k, int mod, int c) {
while (x < N) {
bit[x][k][mod] += c;
x += lowbit(x);
}
}
int Query(int x, int y) {
int ans = 0;
while (x) {
for (int i = 1; i <= 10; i++)
ans += bit[x][i][y % i];
x -= lowbit(x);
}
return ans;
}
void solve() {
int q, op, a, b, k, c;
scanf("%d", &q);
while (q--) {
scanf("%d", &op);
if (op == 2) {
scanf("%d", &a);
printf("%d\n", Query(a ,a) + val[a]);
}
else {
scanf("%d%d%d%d", &a, &b, &k, &c);
Modify(a, k, a % k, c);
Modify(b + 1, k, a % k, -c);
}
}
}
int main() {
while (scanf("%d", &n) != EOF) {
init();
solve();
}
return 0;
}