#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1e5 + 10;
long long tree[MAXN * 4][7][11], s[6][MAXN], a[MAXN];
void Pushup(long long u, long long len) {
  long long z, i, j;
  for (z = 2; z <= 6; z++)
    for (i = 0; i < 2 * (z - 1); i++)
      tree[u][z][i] =
          tree[u * 2][z][i] + tree[u * 2 + 1][z][(i + len) % (2 * (z - 1))];
  return;
}
void Build(long long u, long long l, long long r) {
  long long z, i;
  if (l == r) {
    for (z = 2; z <= 6; z++)
      for (i = 0; i < (z - 1) * 2; i++) tree[u][z][i] = a[l] * s[z][i];
    return;
  }
  long long mid = (l + r) >> 1;
  Build(u * 2, l, mid);
  Build(u * 2 + 1, mid + 1, r);
  Pushup(u, mid - l + 1);
}
void Update(long long u, long long l, long long r, long long pos,
            long long val) {
  long long z, i;
  if (l == r) {
    for (z = 2; z <= 6; z++)
      for (i = 0; i < 2 * (z - 1); i++) tree[u][z][i] = val * s[z][i];
    return;
  }
  long long mid = (l + r) >> 1;
  if (pos <= mid)
    Update(u * 2, l, mid, pos, val);
  else
    Update(u * 2 + 1, mid + 1, r, pos, val);
  Pushup(u, mid - l + 1);
}
long long Query(long long u, long long L, long long R, long long l, long long r,
                long long z, long long i) {
  if (L == l && R == r) return tree[u][z][i];
  long long mid = (L + R) >> 1;
  if (r <= mid) return Query(u * 2, L, mid, l, r, z, i);
  if (l > mid) return Query(u * 2 + 1, mid + 1, R, l, r, z, i);
  return Query(u * 2, L, mid, l, mid, z, i) +
         Query(u * 2 + 1, mid + 1, R, mid + 1, r, z,
               (i + mid - l + 1) % (2 * (z - 1)));
}
int main() {
  long long n, m, z, i, j;
  scanf("%lld", &n);
  for (i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (z = 2; z <= 6; z++) {
    long long mod = 2 * (z - 1);
    for (i = 1; i <= 100000; i++) {
      if (i % mod == 0)
        s[z][i - 1] = 2;
      else if (i % mod <= z)
        s[z][i - 1] = i % mod;
      else
        s[z][i - 1] = (z * 2) - (i % mod);
    }
  }
  Build(1, 1, n);
  scanf("%lld", &m);
  for (i = 1; i <= m; i++) {
    long long op;
    scanf("%lld", &op);
    if (op == 1) {
      long long pos, val;
      scanf("%lld %lld", &pos, &val);
      Update(1, 1, n, pos, val);
    } else {
      long long l, r, z;
      scanf("%lld %lld %lld", &l, &r, &z);
      printf("%lld\n", Query(1, 1, n, l, r, z, 0));
    }
  }
  return 0;
}
