#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int base[60];
  node() { memset(base, 0, sizeof base); }
} node;
const int MAX = 1e5 + 5;
node st[4 * MAX];
int n, arr[MAX];
node merge(const node &a, const node &b) {
  node c;
  for (int i = int(0); i < int(60); i++) {
    c.base[i] = a.base[i] + b.base[(i + a.base[i]) % 60];
  }
  return c;
}
void build(int p, int l, int r) {
  if (l == r) {
    for (int i = int(0); i < int(60); i++) {
      st[p].base[i] = !(i % arr[l]) + 1;
    }
    return;
  }
  build(p * 2, l, (l + r) / 2);
  build(p * 2 + 1, (l + r) / 2 + 1, r);
  st[p] = merge(st[p * 2], st[p * 2 + 1]);
}
void update(int p, int l, int r, int idx, int val) {
  if (l == r && l == idx) {
    arr[l] = val;
    for (int i = int(0); i < int(60); i++) {
      st[p].base[i] = !(i % arr[l]) + 1;
    }
    return;
  }
  int mid = (l + r) / 2;
  if (idx <= mid) {
    update(p * 2, l, mid, idx, val);
  } else {
    update(p * 2 + 1, mid + 1, r, idx, val);
  }
  st[p] = merge(st[p * 2], st[p * 2 + 1]);
}
node query(int p, int l, int r, int i, int j) {
  if (l >= i && j >= r) {
    return st[p];
  }
  int mid = (l + r) / 2;
  if (i > r || l > j) {
    return node();
  }
  return merge(query(p * 2, l, mid, i, j), query(p * 2 + 1, mid + 1, r, i, j));
}
int main() {
  scanf("%d%*c", &n);
  for (int i = int(1); i < int(n + 1); i++) {
    scanf("%d%*c", arr + i);
  }
  build(1, 1, n);
  int q;
  scanf("%d%*c", &q);
  for (int i = int(0); i < int(q); i++) {
    char type;
    int x, y;
    scanf("%c %d %d%*c", &type, &x, &y);
    if (type == 'A') {
      y--;
      printf("%d\n", query(1, 1, n, x, y).base[0]);
    } else {
      update(1, 1, n, x, y);
    }
  }
  return 0;
}
