#include <bits/stdc++.h>
#define ls (id * 2)
#define rs (id * 2 + 1)
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
ll n, a[N], b[N], q;
ll tr[N << 2];
set <ll> s;
void push_up(ll id) {
tr[id] = tr[ls] + tr[rs];
return ;
}
void build(ll id, ll l, ll r) {
if (l == r) {
tr[id] = a[l];
return ;
}
ll mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
push_up(id);
return ;
}
void upd(ll id, ll l, ll r, ll x, ll val) {
if (l == r) {
tr[id] = val;
return ;
}
ll mid = (l + r) >> 1;
if (x <= mid) upd(ls, l, mid, x, val);
else upd(rs, mid + 1, r, x, val);
push_up(id);
return ;
}
ll query(ll id, ll l, ll r, ll x, ll y) {
if (l >= x && r <= y) return tr[id];
ll mid = (l + r) >> 1, res = 0;
if (x <= mid) res += query(ls, l, mid, x, y);
if (y > mid) res += query(rs, mid + 1, r, x, y);
return res;
}
int main(void) {
scanf("%lld", &n);
for (ll i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
build(1, 1, n);
for (ll i = 1; i <= n; ++i) {
scanf("%lld", &b[i]);
if (b[i] > 1) s.insert(i);
}
scanf("%lld", &q);
while (q--) {
ll op, l, r;
scanf("%lld %lld %lld", &op, &l, &r);
if (op == 1) {
upd(1, 1, n, l, r);
a[l] = r;
}
else if (op == 2) {
if (r == 1) {
if (b[l] > 1) s.erase(l);
}
else s.insert(l);
}
else {
ll now = l, ans = 0;
while (now <= r) {
auto it = s.lower_bound(now);
ll x;
if (it == s.end()) {
x = n + 1;
}
else x = *it;
if (x <= r) {
if (x - 1 >= now) {
ans += query(1, 1, n, now, x - 1);
}
ans = max(ans + a[x], ans * b[x]);
now = x + 1;
}
else {
ans += query(1, 1, n, now, r);
break;
}
}
printf("%lld\n", ans);
}
}
return 0;
}