#include <bits/stdc++.h>   using namespace std;   const int maxn = 100110;   const int maxm = 100010;   char s[maxn][5];   long long sum[maxm * 4][5][11];   int n;   void init() {     for (int i = 1; i < maxn; i++)       for (int z = 2; z <= 6; z++) {         int tp = i % (2 * (z - 1));         if (tp == 0)           s[i][z - 2] = 2;         else if (tp <= z)           s[i][z - 2] = tp;         else           s[i][z - 2] = 2 * z - tp;       }   }   void build(int pos, int l, int r) {     for (int i = 2; i <= 6; i++)       for (int j = 0; j <= 10; j++) sum[pos][i - 2][j] = 0;     if (l == r) return;     int mid = (l + r) >> 1;     build((pos << 1), l, mid);     build(((pos << 1) | 1), mid + 1, r);   }   void insert(int pos, int l, int r, int i, int a) {     if (i < l || i > r) return;     if (l == r) {       for (int z = 2; z <= 6; z++)         for (int j = 0; j <= 10; j++)           sum[pos][z - 2][j] = (long long)s[i + j][z - 2] * a;       return;     }     int mid = (l + r) >> 1;     insert((pos << 1), l, mid, i, a);     insert(((pos << 1) | 1), mid + 1, r, i, a);     for (int z = 2; z <= 6; z++)       for (int j = 0; j <= 10; j++)         sum[pos][z - 2][j] =             sum[(pos << 1)][z - 2][j] + sum[((pos << 1) | 1)][z - 2][j];   }   long long search(int pos, int l, int r, int x, int y, int z, int offset) {     if (y < l || r < x) return 0;     if (x <= l && r <= y) return sum[pos][z - 2][offset];     int mid = (l + r) >> 1;     return search((pos << 1), l, mid, x, y, z, offset) +            search(((pos << 1) | 1), mid + 1, r, x, y, z, offset);   }   int main() {     init();     while (~scanf( %d , &n)) {       build(1, 1, n);       for (int i = 1; i <= n; i++) {         int a;         scanf( %d , &a);         insert(1, 1, n, i, a);       }       int m;       scanf( %d , &m);       while (m-- > 0) {         int t, p, v, l, r, z;         scanf( %d , &t);         if (t == 1) {           scanf( %d%d , &p, &v);           insert(1, 1, n, p, v);         } else {           scanf( %d%d%d , &l, &r, &z);           int offset = 0;           if (s[l][z - 2] <= s[l + 1][z - 2]) {             if (s[l][z - 2] == 1)               offset = 0;             else               offset = z - s[l][z - 2] + z - 1;           } else {             offset = s[l][z - 2] - 1;           }           cout << search(1, 1, n, l, r, z, offset) << endl;         }       }     }     return 0;   }   