1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include<bits/stdc++.h>
using namespace std;
using ll =long long ;
const int maxn=5e5+9;
struct Node{ int l,r,v; }tr[maxn<<2];
int gcd(int ma,int mi){return mi?gcd(mi,ma%mi):ma;}
int a[maxn],n,m,cnt;
void build(int l,int r,int now){ if(l==r){ tr[now].v=a[l]; return ; } int mid=(l+r)>>1; build(l,mid,now<<1),build(mid+1,r,(now<<1)|1); tr[now].v=gcd(tr[now<<1].v,tr[(now<<1)|1].v); }
void modify(int x,int l,int r,int now){ if(l==r){ tr[now].v=a[x]; return ; } int mid=(l+r)>>1; if(x<=mid)modify(x,l,mid,now<<1); else modify(x,mid+1,r,(now<<1)|1); tr[now].v=gcd(tr[now<<1].v,tr[(now<<1)|1].v); }
void check(int l,int r,int now,int ll,int rr,int x){ if(cnt>=2)return; if(l==r){ if(tr[now].v%x)cnt+=1; return ; } if(tr[now].v%x==0)return ; int mid=(l+r)>>1; if(mid>=ll)check(l,mid,now<<1,ll,rr,x); if(mid<rr)check(mid+1,r,(now<<1)|1,ll,rr,x); }
int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n; for(int i=1;i<=n;++i)cin>>a[i]; build(1,n,1); cin>>m; for(int i=1,x,y,z,w;i<=m;++i){ cin>>x>>y>>z; if(x&1){ cnt=0; cin>>w; check(1,n,1,y,z,w); cout<<(cnt>=2?"NO\n":"YES\n"); }else{ a[y]=z; modify(y,1,n,1); } } }
|