#include <bits/stdc++.h>
using namespace std;
long long int bit[7][12][100024];
long long int v[7][12][100024];
int N, M;
inline void updateBit(int y, int x, int o, long long int v) {
  int i;
  for (i = y; i <= N; i += i & -i) {
    bit[x][o][i] += v;
  }
}
long long int Z[7][32];
int SZ[7];
inline long long int queryBit(int y, int x, int o) {
  long long int r = 0;
  int i;
  for (i = y; i; i -= i & -i) {
    r += bit[x][o][i];
  }
  return r;
}
int main() {
  int i, n, t;
  long long a, b;
  memset(bit, 0, sizeof(bit));
  for (a = 2; a <= 6; a++) {
    n = 0;
    for (i = 1; i <= a; i++) {
      Z[a][n++] = i;
    }
    for (i = a - 1; i > 1; i--) {
      Z[a][n++] = i;
    }
    SZ[a] = n;
  }
  scanf("%d", &N);
  for (i = 1; i <= N; i++) {
    scanf("%I64d", &a);
    for (n = 2; n <= 6; n++) {
      for (t = 0; t < SZ[n]; t++) {
        b = a * Z[n][(i + -t - 1 + SZ[n]) % SZ[n]];
        v[n][t][i] = b;
        updateBit(i, n, t, b);
      }
    }
  }
  scanf("%d", &M);
  while (M--) {
    scanf("%d", &t);
    switch (t) {
      case 1:
        scanf("%d %I64d", &i, &a);
        for (n = 2; n <= 6; n++) {
          for (t = 0; t < SZ[n]; t++) {
            b = a * Z[n][(i - 1 - t + SZ[n]) % SZ[n]];
            updateBit(i, n, t, b - v[n][t][i]);
            v[n][t][i] = b;
          }
        }
        break;
      case 2:
        scanf("%d %d %d", &i, &n, &t);
        a = queryBit(n, t, (i - 1) % SZ[t]) -
            queryBit(i - 1, t, (i - 1) % SZ[t]);
        printf("%I64d\n", a);
    }
  }
}
