#include #include const int MAXN = 100001; const int MAXM = 100000; int n, m; int array[MAXN]; int bit2[MAXN], bit3[MAXN], bit5[MAXN]; int ans[MAXN]; struct Query { int type, l, r, v; void Input() { assert(scanf("%d", &type) == 1); if (type == 1) assert(scanf("%d%d%d", &l, &r, &v) == 3); else { assert(scanf("%d%d", &l, &v) == 2); assert(v > 0); } } } queries[MAXM]; inline int Lowbit(int x) { return x & -x; } void Init() { // Read all the queries at a time and store them in queries[] assert(scanf("%d", &n) == 1); for (int i = 1; i <= n; ++i) assert(scanf("%d", array + i) == 1); assert(scanf("%d", &m) == 1); for (int i = 0; i < m; ++i) { queries[i].Input(); } } void Add(int bit[], int x, int v) { // Modify the BIT for ( ; x <= n; x += Lowbit(x)) bit[x] += v; } int Get(int bit[], int x) { // Query the BIT int ret = 0; for ( ; x; x -= Lowbit(x)) ret += bit[x]; return ret; } int GetAns(int number, int pos) { // Compute the result of a element int cnt2 = 0, cnt3 = 0, cnt5 = 0; while (number % 2 == 0) { number /= 2; ++cnt2; } while (number % 3 == 0) { number /= 3; ++cnt3; } while (number % 5 == 0) { number /= 5; ++cnt5; } cnt2 -= Get(bit2, pos); cnt3 -= Get(bit3, pos); cnt5 -= Get(bit5, pos); for (int i = 0; i < cnt2; ++i) number *= 2; for (int i = 0; i < cnt3; ++i) number *= 3; for (int i = 0; i < cnt5; ++i) number *= 5; return number; } void Work() { // Deal with queries in a reversed order. for (int i = m - 1; i >= 0; --i) { if (queries[i].type == 1) { if (queries[i].v == 2) { Add(bit2, queries[i].l, 1); Add(bit2, queries[i].r + 1, -1); } else if (queries[i].v == 3) { Add(bit3, queries[i].l, 1); Add(bit3, queries[i].r + 1, -1); } else { assert(queries[i].v == 5); Add(bit5, queries[i].l, 1); Add(bit5, queries[i].r + 1, -1); } } else { if (ans[queries[i].l] == 0) { // If the result of the l-th element is not computed yet, compute it. ans[queries[i].l] = GetAns(queries[i].v, queries[i].l); } } } // Compute the result of elements that are not computed yet and output them. for (int i = 1; i <= n; ++i) { if (ans[i] == 0) ans[i] = GetAns(array[i], i); printf("%d%c", ans[i], i == n ? '\n' : ' '); } } int main() { int cases = 1; while (cases--) { Init(); Work(); } return 0; }