提交时间:2024-10-04 21:43:51
运行 ID: 33306
#include<bits/stdc++.h> using namespace std; #define ll long long const int mod=998244353,N=1e5+10,V=1e5+10;ll INF=1e11+10; struct segtree{ #define mid (l+r)/2 int T[N*100],lc[N*100],rc[N*100]; int tot=V; void pu(int p){ if(lc[p]) T[p]=min(T[p],T[lc[p]]); if(rc[p]) T[p]=min(T[p],T[lc[p]]); }void upd(int p,int l,int r,int x,int v){ if(l==r) {T[p]+=v;return ;} if(x<=mid){ if(!lc[p]) lc[p]=++tot; upd(lc[p],l,mid,x,v); }if(x>mid){ if(!rc[p]) rc[p]=++tot; upd(rc[p],mid+1,r,x,v); }pu(p); }int qry(int p,int l,int r,int pl,int pr){ int cnt=1e9+10; if(pl<=l&&r<=pr) return T[p]; if(pl<=mid&&lc[p]) cnt=min(cnt,qry(lc[p],l,mid,pl,pr)); if(pr>mid&&rc[p]) cnt=min(cnt,qry(rc[p],mid+1,r,pl,pr)); return cnt; } #undef mid }sgt1;int n,q,a[N],b[N]; vector<int> d[N]; struct segment{ #define ls p*2 #define rs p*2+1 #define mid (l+r)/2 ll T[N<<2];int tg[N<<2]; void pu(int p){ T[p]=min(T[ls],T[rs]); }void pd(int p,int l,int r){ if(tg[p]==0) return ; tg[ls]=tg[p]; tg[rs]=tg[p]; ll t1=INF,t2=INF; for(auto ed:d[tg[p]]){ t1=min(t1,1ll*sgt1.qry(ed,1,n,l,mid)/ed*tg[p]/ed); t2=min(t2,1ll*sgt1.qry(ed,1,n,mid+1,r)/ed*tg[p]/ed); }T[ls]=t1,T[rs]=t2; tg[p]=0; }void bd(int p,int l,int r){ if(l==r){ ll t1=INF; for(auto ed:d[a[l]]){ t1=min(t1,1ll*sgt1.qry(ed,1,n,l,r)/ed*a[l]/ed); }T[p]=t1; } }void upd(int p,int l,int r,int pl,int pr,int v){ if(pl<=l&&r<=pr){ ll t1=INF; for(auto ed:d[v]){ t1=min(t1,1ll*qry(ed,1,n,l,r)/ed*v/ed); }T[p]=t1;tg[p]=v;return ; }pd(p,l,r);if(pl<=mid) upd(ls,l,mid,pl,pr,v); if(pr>mid) upd(rs,mid+1,r,pl,pr,v);pu(p); }ll qry(int p,int l,int r,int pl,int pr){ if(pl<=l&&r<=pr) return T[p]; ll t1=INF; if(pl<=mid) t1=min(t1,qry(ls,l,mid,pl,pr)); if(pr>mid) t1=min(t1,qry(rs,mid+1,r,pl,pr)); } #undef ls #undef rs #undef mid }sgt2; int main(){ //freopen("sequence.in","r",stdin); //freopen("sequence.out","w",stdout); cin>>n>>q;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<=V-5;i++){ for(int j=i;j<=V-5;j+=i){ d[j].push_back(i); } }for(int i=1;i<=n;i++){ for(auto ed:d[b[i]]){ sgt1.upd(ed,1,n,i,b[i]); } }sgt2.bd(1,1,n); while(q--){ int op,l,r,x;cin>>op>>l>>r; if(op==1){ cin>>x;sgt2.upd(1,1,n,l,r,x); }else{ cout<<sgt2.qry(1,1,n,l,r)<<endl; } } return 0; }