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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| #ifndef VLSMB_VS #include <bits/stdc++.h> #else #include <iostream> #include <iomanip> #include <set> #include <algorithm> #include <map> #include <vector> #include <stack> #endif
#define int long long #define pii pair<int,int> #define endl '\n' #define veci vector<int> #define vecpi vector<pii > #define mpi map<int,int> #define mpc map<char,int> #define inf 0x7fffffffffffffff #define yes cout<<"yes"<<endl #define no cout<<"no"<<endl #define seti set<int> #define mulseti multiset<int> #define setpi set<pii > #define priqli priority_queue<int,veci,less<int> > #define priqgi priority_queue<int,veci,greater<int> > using namespace std; const int N = 6e5; void solve(); void init();
signed main() { ios::sync_with_stdio(false); cin.tie(0); int t=1; init(); while(t--)solve(); cout.flush(); return 0; }
int gcd(int a,int b) { return b?gcd(b,a%b):a; } struct node { int l,r,v; }tr[4*N]; int a[N]; void build(int l,int r,int i) { tr[i].l=l; tr[i].r=r; if(l==r) { tr[i].v=a[l]; return; } int mid=(l+r)>>1; build(l,mid,2*i); build(mid+1,r,2*i+1); tr[i].v=gcd(tr[2*i].v,tr[2*i+1].v); } bool query(int l,int r,int i,int x,int&ans) { if(ans>1)return false; if(tr[i].l==l&&tr[i].r==r) { if(tr[i].v%x==0)return true; if(l==r) { ans++; if(ans>1)return false; else return true; } } int mid=(tr[i].l+tr[i].r)>>1; if(mid>=r)return query(l,r,2*i,x,ans); else if(mid<l)return query(l,r,2*i+1,x,ans); else return query(l,mid,2*i,x,ans) && query(mid+1,r,2*i+1,x,ans); } void update(int l,int r,int i,int x) { if(tr[i].l==l&&tr[i].r==r) { tr[i].v=x; return; } int mid=(tr[i].l+tr[i].r)>>1; if(mid>=r)update(l,r,2*i,x); else if(mid<l)update(l,r,2*i+1,x); else { update(l,mid,2*i,x); update(mid+1,r,2*i+1,x); } tr[i].v=gcd(tr[2*i].v,tr[2*i+1].v); }
void solve() { int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; int op,l,r,x,y,ans; build(1,n,1); int q; cin>>q; while(q--) { cin>>op; if(op==1) { cin>>l>>r>>x; ans=0; cout<<(query(l,r,1,x,ans)?"YES":"NO")<<endl; } else if(op==2) { cin>>x>>y; update(x,x,1,y); } } } void init() {
}
|