#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2")
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define endl '\n'

const int MAXN = 100100;

// struct node {
// 	node *lv, *rv;
// 	int max, sum;
// };

int n;
int arr[MAXN], brr[MAXN];
// node mem[MAXN << 1];
// node *mpos = mem, *root;

// void relax(node *v) {
// 	v->sum = v->lv->sum + v->rv->sum;
// 	v->max = max(v->lv->max, v->rv->max);
// }

// void build(node* &v, int l, int r) {
// 	if (v == nullptr) v = mpos++;
// 	if (r - l == 1) {
// 		v->max = v-> sum = arr[l];
// 		return;
// 	}
// 	int mid = (l + r) >> 1;
// 	build(v->lv, l, mid);
// 	build(v->rv, mid, r);
// 	relax(v);
// }

void build() {
	// build(root, 0, n);
}

// int go_query(node *v, int l, int r, int ql, int qr) {
// 	if (qr <= l || r <= ql) return 0;
// 	if (ql <= l && r <= qr) return v->sum;
// 	int mid = (l + r) >> 1;
// 	auto xl = go_query(v->lv, l, mid, ql, qr);
// 	auto xr = go_query(v->rv, mid, r, ql, qr);
// 	return xl + xr;
// }

// int max_query(node *v, int l, int r, int ql, int qr) {
// 	if (qr <= l || r <= ql) return 0;
// 	if (ql <= l && r <= qr) return v->max;
// 	int mid = (l + r) >> 1;
// 	auto xl = go_query(v->lv, l, mid, ql, qr);
// 	auto xr = go_query(v->rv, mid, r, ql, qr);
// 	return max(xl, xr);
// }

void go_exp(int k) {
	if (k > 17) return;
	--k;
	int ma = *max_element(arr, arr + n);
	int val = ma;
	for (int j = 0; j < k; ++j) {
		val *= ma;
		if (val > 100'000) return;
	}
	for (int i = 0; i < n; ++i) {
		int x = arr[i];
		for (int j = 0; j < k; ++j)
			arr[i] *= x;
	}
}

int aboba(int val, int k) {
	for (int y = 1; ; ++y) {
		int z = 1;
		for (int j = 0; j < k; ++j) {
			z *= y;
			if (z > val) return -1;
		}
		if (z == val) return y;
	}
	return -1;
}

void go_dec(int k) {
	if (k > 17) return;
	memcpy(brr, arr, sizeof(arr));
	for (int i = 0; i < n; ++i) {
		int y = aboba(arr[i], k);
		if (y == -1) {
			memcpy(arr, brr, sizeof(brr));
			return;
		}
		arr[i] = y;
	}
}

int go_query(int l, int r) {
	int ans = 0;
	for (int i = l; i < r; ++i)
		ans += arr[i];
	return ans;
}

signed main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	cin >> n;
	for (int i = 0; i < n; ++i)
		cin >> arr[i];
	build();
	int q; cin >> q;
	while (q--) {
		int tp, k, l, r; cin >> tp;
		switch (tp) {
		case 1:
			cin >> k;
			go_exp(k);
			break;
		case 2:
			cin >> k;
			go_dec(k);
			break;
		case 3:
			cin >> l >> r, --l;
			cout << go_query(l, r) << endl;
			break;
		}
	}
}