拼尽全力无法战胜
#include <bits/stdc++.h>
#define fr first
#define se second
#define Un unsigned
#define LL long long
#define pb push_back
#define pii pair<int,int>
#define pLi pair<LL,int>
#define pLL pair<LL,LL>
#define __ __int128
#define LD long double
#define VE vector<LL>
#define DB double
#define Ve vector<int>
using namespace std;
inline LL read()
{
LL x = 0,f = 1;char ch = getchar();
while(!isdigit(ch)) (ch == '-') && (f = -1),ch = getchar();
while(isdigit(ch)) x = x*10+ch-48,ch = getchar();
return x*f;
}
const int P = 1e9+7,N = 5e5+5;
struct tree{int l,r;LD mx,mul;LL sum,smx;}tr[N<<2];
LL x[N],y[N];
inline void pushup(int i)
{
if (tr[i<<1].mx < tr[i<<1].mul+tr[i<<1|1].mx) tr[i].mx = tr[i<<1].mul+tr[i<<1|1].mx,tr[i].smx = tr[i<<1].sum*tr[i<<1|1].smx%P;
else tr[i].mx = tr[i<<1].mx,tr[i].smx = tr[i<<1].smx;
tr[i].sum = tr[i<<1].sum*tr[i<<1|1].sum%P;
tr[i].mul = tr[i<<1].mul+tr[i<<1|1].mul;
}
void build(int l,int r,int i)
{
tr[i].l = l,tr[i].r = r;
if (l == r) return (void)(tr[i].mul = logl(tr[i].sum = x[l]),tr[i].mx = logl(x[l]*y[l]),tr[i].smx = x[l]*y[l]%P);
int mid = (l+r)>>1;
build(l,mid,i<<1),build(mid+1,r,i<<1|1);
pushup(i);
}
void M1(int p,int k,int i)
{
if (tr[i].l == tr[i].r) return (void)(tr[i].mul = logl(tr[i].sum = k));
if (p <= tr[i<<1].r) M1(p,k,i<<1);
else M1(p,k,i<<1|1);
pushup(i);
}
void M2(int p,int k,int i)
{
if (tr[i].l == tr[i].r) return (void)(tr[i].mx = logl(tr[i].sum*k),tr[i].smx = tr[i].sum*k%P);
if (p <= tr[i<<1].r) M2(p,k,i<<1);
else M2(p,k,i<<1|1);
pushup(i);
}
int main()
{
int n = read();
for (int i = 0;i < n;i++) x[i] = read();
for (int i = 0;i < n;i++) y[i] = read();
build(0,n-1,1);
printf("%lld\n",tr[1].smx);
int m = read();
while (m--)
{
int op = read(),pos = read(),val = read();
if (op == 1) M1(pos,val,1);
else M2(pos,val,1);
printf("%lld\n",tr[1].smx);
}
return 0;
}