提交时间:2024-10-04 19:36:25

运行 ID: 33286

#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define lson t[pos].ls #define rson t[pos].rs #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} int gcd(int x,int y){return !x||!y?x|y:gcd(y%x,x);} const int MAXN=200010,N=130,Mod=1000000007; ll inf=1000000000000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int n,m,k,cnt,a[MAXN],b[MAXN]; struct node{ int ls,rs; ll x; }t[MAXN*N]; struct DSegtree{ int rt; void pushup(int pos){ t[pos].x=min(t[lson].x,t[rson].x); } void upd(int &pos,int l,int r,int x){ if(!pos)pos=++cnt; if(l==r){ t[pos].x=b[l]; return; } int mid=(l+r)>>1; if(x<=mid)upd(lson,l,mid,x); if(x>mid)upd(rson,mid+1,r,x); pushup(pos); } ll qry(int pos,int l,int r,int ql,int qr){ if(!pos)return inf; if(ql<=l&&qr>=r)return t[pos].x; int mid=(l+r)>>1;ll res=inf; if(ql<=mid)res=qry(lson,l,mid,ql,qr); if(qr>mid)res=min(res,qry(rson,mid+1,r,ql,qr)); return res; } }T[MAXN]; #undef lson #undef rson #define lson (pos<<1) #define rson (pos<<1|1) vector<int>G[MAXN]; void init(){ for(int i=1;i<=100000;i++){ for(int j=1;j*j<=i;j++){ if(i%j==0){ G[i].pb(j); if(i*i!=j)G[i].pb(i/j); } } } } ll qry(int l,int r,int x){ // cout<<l<<" "<<r<<" "<<x<<":"; ll res=inf; for(auto i:G[x]){ res=min(res,T[i].qry(T[i].rt,1,n,l,r)*(ll)x/i/i); res=min(res,T[x/i].qry(T[x/i].rt,1,n,l,r)*(ll)x/(x/i)/(x/i)); } // cout<<res<<endl; return res; } struct segtree{ ll t[MAXN<<2]; int lz[MAXN<<2]; void pushup(int pos){ t[pos]=min(t[lson],t[rson]); } void pushdown(int pos,int l,int r){ if(lz[pos]){ int mid=(l+r)>>1,x=lz[pos]; t[lson]=qry(l,mid,x),t[rson]=qry(mid+1,r,x); lz[lson]=lz[rson]=x; lz[pos]=0; } } void build(int pos,int l,int r){ if(l==r){ t[pos]=qry(l,l,a[l]); return; } int mid=(l+r)>>1; build(lson,l,mid);build(rson,mid+1,r); pushup(pos); } void prt(int pos,int l,int r){ if(l==r)return; int mid=(l+r)>>1; prt(lson,l,mid);prt(rson,mid+1,r); } void update(int pos,int l,int r,int ql,int qr,int x){ if(ql<=l&&qr>=r){ t[pos]=qry(l,r,x); lz[pos]=x; return; } pushdown(pos,l,r); int mid=(l+r)>>1; if(ql<=mid)update(lson,l,mid,ql,qr,x); if(qr>mid)update(rson,mid+1,r,ql,qr,x); pushup(pos); } ll query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r)return t[pos]; pushdown(pos,l,r); int mid=(l+r)>>1;ll res=inf; if(ql<=mid)res=query(lson,l,mid,ql,qr); if(qr>mid)res=min(res,query(rson,mid+1,r,ql,qr)); return res; } }TR; void slv(){init(); n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<=n;i++)b[i]=read(); t[0].x=inf; for(int i=1;i<=n;i++){ for(int j=1;j*j<=b[i];j++){ if(b[i]%j==0){ T[j].upd(T[j].rt,1,n,i); if(b[i]/j!=j)T[b[i]/j].upd(T[b[i]/j].rt,1,n,i); } } } TR.build(1,1,n); while(m--){ int op=read(),l=read(),r=read(),x=op==1?read():0; if(op==1)TR.update(1,1,n,l,r,x); else printf("%lld\n",TR.query(1,1,n,l,r)); } } signed main(){ slv(); return 0; }