```cpp
#include <bits/stdc++.h>
#define int long long
// 以下为缺省源
#define _cst const
#define _IfD long long
#define _siz 20
char buf[1<<_siz],buffer[1<<_siz],*p1=buf,*p2=buf,cH=' ';
int op1=-1; _cst int op2=(1<<_siz)-1;
inline char gc(){return (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<_siz,stdin)),p1==p2?EOF:*p1++);}
inline void flush(){fwrite(buffer,1,op1+1,stdout),op1=-1;}
inline void pc(_cst char &x){if(op1==op2)flush();buffer[++op1]=x;}
template<typename T>void read(T &w){
w=0;bool f=1;char ch=gc();
for(;ch<'0' || ch>'9';ch=gc()) if(ch=='-')f=0;
for(;'0'<=ch && ch<='9';ch=gc()) w=(w<<1)+(w<<3)+(ch^48);
w=f?w:-w;
}template<typename T,typename ...Arg>void read(T &w,Arg &...arg){
read(w); read(arg...);
}template<typename T>void wrt(T x){
if(x<0) pc('-'),x=-x;
if(x>9) wrt(x/10);
pc(x%10|48);
}template<typename T>void write(T x){
wrt(x); pc(cH);
}template<typename T,typename ...Arg>void write(T x,Arg ...arg){
write(x); write(arg...);
}inline _IfD pow_10(_IfD x){
_IfD base=10,ans=1;
while(x) ans*=((x&1)?base:1),base*=base,x>>=1;
return ans;
}template<typename T>void readd(T &w){
w=0; _IfD x=0,cnt=0; bool f=1; char ch=gc();
for(;ch<'0' || ch>'9';ch=gc()); if(ch=='-')f=0;
for(;'0'<=ch && ch<='9';ch=gc()) x=(x<<1)+(x<<3)+(ch^48);
w=(T)(f?x:-x);
if(ch!='.') return; x=0,ch=gc();
for(;'0'<=ch && ch<='9';ch=gc(),++cnt) x=(x<<1)+(x<<3)+(ch^48);
T tmp=(T)(x/(T)pow_10(cnt));
w=w+(T)(f?tmp:-tmp);
}template<typename T,typename ...Arg>void readd(T &w,Arg &...arg){
readd(w); readd(arg...);
}
template<typename T>inline T qmax(_cst T &a,_cst T &b){return a>b?a:b;}
template<typename T,typename ...Arg>inline T qmax(_cst T &a,_cst T &b,_cst Arg &...arg){return qmax(a,qmax(b,arg...));}
template<typename T>inline T qmin(_cst T &a,_cst T &b){return a<b?a:b;}
template<typename T,typename ...Arg>inline T qmin(_cst T &a,_cst T &b,_cst Arg &...arg){return qmin(a,qmin(b,arg...));}
template<typename T>inline void qswap(T &a,T &b){a+=b,b=a-b,a-=b;}
// 以上为缺省源
using namespace std;
const int MAXN=200005,mod=1e9+7;
const int INF=INT_MAX;
int a[MAXN],b[MAXN],c[MAXN];
int mulb[MAXN<<2],mulc[MAXN<<2],cntb[MAXN<<2],cntc[MAXN<<2];
int mx[MAXN<<2],mn[MAXN<<2],tag[MAXN<<2];
inline int ksm(int a,int b){
int ans=1;
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod,b>>=1;
}
return ans;
}
inline int inv(int p){return ksm(p,mod-2);}
void push_up(int p){
mulb[p]=1ll*mulb[p<<1]*mulb[p<<1|1]%mod;
mulc[p]=1ll*mulc[p<<1]*mulc[p<<1|1]%mod;
cntb[p]=cntb[p<<1]+cntb[p<<1|1];
cntc[p]=cntc[p<<1]+cntc[p<<1|1];
mx[p]=qmax(mx[p<<1],mx[p<<1|1]);
mn[p]=qmin(mn[p<<1],mn[p<<1|1]);
}
void addtag(int p,int k){
mulc[p]=ksm(tag[p]=k,cntc[p]);
}
void push_down(int p,int l,int r){
if(tag[p]==-1) return;
addtag(p<<1,tag[p]);
addtag(p<<1|1,tag[p]);
tag[p]=-1;
}
void build(int p,int l,int r){
if(l==r){
if(c[l]<b[l]){
mulb[p]=1,mulc[p]=c[l];
cntb[p]=0,cntc[p]=1;
mn[p]=b[l];
}else{
mulb[p]=b[l],mulc[p]=1;
cntb[p]=1,cntc[p]=0;
mn[p]=INF;
}
mx[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
void chg(int p,int l,int r,int t,int k){
if(l==r){
mx[p]=qmax(mx[p],k);
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(t<=mid) chg(p<<1,l,mid,t,k);
else chg(p<<1|1,mid+1,r,t,k);
push_up(p);
}
void updb(int p,int l,int r,int t,int k,int pr){
if(l==r){
pr=qmax(pr,mx[p]);
if(k>pr){
mulb[p]=1,mulc[p]=pr;
cntb[p]=0,cntc[p]=1;
mn[p]=k;
}else{
mulb[p]=k,mulc[p]=1;
cntb[p]=1,cntc[p]=0;
mn[p]=INF;
}
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
if(t<=mid) updb(p<<1,l,mid,t,k,pr);
else updb(p<<1|1,mid+1,r,t,k,qmax(pr,mx[p<<1]));
push_up(p);
}
void updc(int p,int l,int r,int st,int en,int k){
if(l>en || r<st) return;
if(st<=l && r<=en && mn[p]>k) return addtag(p,k),void();
if(l==r){
mulc[p]=1,mulb[p]=b[l];
cntc[p]=0,cntb[p]=1;
mn[p]=INF;
return;
}
push_down(p,l,r);
int mid=(l+r)>>1;
updc(p<<1,l,mid,st,en,k);
updc(p<<1|1,mid+1,r,st,en,k);
push_up(p);
}
int ser(int p,int l,int r,int x,int pre){
if(mx[p]<=x) return r+1;
if(l==r) return l;
int mid=(l+r)>>1;
if(qmax(pre,mx[p<<1])>x) return ser(p<<1,l,mid,x,pre);
else return ser(p<<1|1,mid+1,r,x,qmax(pre,mx[p<<1]));
}
int getc(int p,int l,int r,int t,int ans){
if(l==r) return qmax(ans,mx[p]);
int mid=(l+r)>>1;
if(t<=mid) return getc(p<<1,l,mid,t,ans);
else return getc(p<<1|1,mid+1,r,t,qmax(ans,mx[p<<1]));
}
signed main(){
memset(tag,-1,sizeof(tag));
int n,q; read(n,q);
c[0]=-1;
for(int i=1;i<=n;i++) read(a[i]),c[i]=qmax(c[i-1],a[i]);
for(int i=1;i<=n;i++) read(b[i]);
build(1,1,n);
while(q--){
int op,x,y; read(op,x,y);
if(op==0){
chg(1,1,n,x,y);
int cur=getc(1,1,n,x,-1);
if(cur<y) updc(1,1,n,x,ser(1,1,n,y,-1)-1,y);
}else{
b[x]=y,updb(1,1,n,x,y,-1);
}
wrt((int)(1ll*mulb[1]*mulc[1]%mod)),pc(10);
}
return flush(),0;
}
```
by E1_de5truct0r @ 2023-01-09 08:53:17