#include<bits/stdc++.h>
#define N 50005
#define mod 100000007
using namespace std;
int n,m;
int a[N],c[N],b[N];
int lazy[N<<2],val1[N<<2],val2[N<<2],tag[N<<2],mul[N<<2];
void push_up(int p){
if(tag[p<<1]&&tag[p<<1|1]) tag[p]=1;
mul[p]=(mul[p<<1]*mul[p<<1|1])%mod;
val1[p]=max(val1[p<<1],val1[p<<1|1]);
val2[p]=max(val2[p<<1],val2[p<<1|1]);
}
void push_down(int p){
if(lazy[p]){
lazy[p<<1]=lazy[p];
lazy[p<<1|1]=lazy[p];
val1[p<<1]=lazy[p];
val1[p<<1|1]=lazy[p];
lazy[p]=0;
}
}
void build(int p,int l,int r){
if(l==r){
val1[p]=c[l];
val2[p]=b[l];
mul[p]=min(b[l],c[l])%mod;
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
void modify1(int p,int l,int r,int x,int v){
if(l==r){
val2[p]=x;
mul[p]=min(val1[p],val2[p]);
if(val1[p]<val2[p]) tag[p]=0;
else tag[p]=1;
return ;
}
push_down(p);
int mid=(l+r)>>1;
if(x<=mid) modify1(p<<1,l,mid,x,v);
else modify1(p<<1|1,mid+1,r,x,v);
push_up(p);
}
int binary_search(int p,int l,int r,int x){
if(l==r){
if(l==1&&val1[p]>=x) return 0;
else return l;
}
push_down(p);
int mid=(l+r)>>1;
if(val1[p<<1]<=x) return binary_search(p<<1|1,l,mid,x);
else return binary_search(p<<1|1,mid+1,r,x);
}
void modify(int p,int l,int r,int ql,int qr,int v){
if(ql<=l&&qr>=r){
lazy[p]=v;
val1[p]=v;
if(val1[p]<val2[p]) tag[p]=0;
else tag[p]=1;
if(tag[p]) return ;
}
if(l==r){
val1[p]=v;
mul[p]=min(val1[p],val2[p]);
return ;
}
push_down(p);
int mid=(l+r)>>1;
if(ql<=mid) modify(p<<1,l,mid,ql,qr,v);
if(qr>mid) modify(p<<1|1,mid+1,r,ql,qr,v);
push_up(p);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) c[i]=max(a[i],c[i-1]);
build(1,1,n);
while(m--){
int op,x,y;
scanf("%lld%lld%lld",&op,&x,&y);
if(!op){
int t=binary_search(1,1,n,y);
if(t>=x){
modify(1,1,n,x,t,y);
}
}
else{
modify1(1,1,n,x,y);
}
cout<<mul[1]<<endl;
}
}
这是我的代码,开了 long long 后就挂了,你们可以自己测一下。