#include<bits/stdc++.h>
using namespace std;
long long tree[4000005];
long long n,m,ci,cnt=0;
inline int read() {
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int gcd(int x,int y) {
if(y==0) return x;
return gcd(y,x%y);
}
void up(int p) {
tree[p]=gcd(tree[p<<1],tree[p<<1|1]);
}
void build(int p,int l,int r) {
if(l==r) {
tree[p]=read();
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
up(p);
}
void change(int p,int l,int r,int k,int z) {
if(l==r) {
tree[p]=z;
return;
}
int mid=(l+r)>>1;
if(k<=mid) change(p<<1,l,mid,k,z);
if(k>mid) change(p<<1|1,mid+1,r,k,z);
up(p);
}
void ask(int p,int l,int r,int L,int R,int z) {
if(cnt>1||tree[p]%z==0) return;
if(l==r) {
cnt++;
return;
}
int mid=(l+r)>>1;
if(L<=mid) ask(p<<1,l,mid,L,R,z);
if(R>mid) ask(p<<1|1,mid+1,r,L,R,z);
}
int main() {
n=read();
// for(int i=1; i<=n; i++) {
// cin>>a[i];
// }
build(1,1,n);
m=read();
int w,l,r,z,k;
for(int i=1; i<=m; i++) {
w=read();
switch(w){
case 2:
k=read(),z=read();
change(1,1,n,k,z);
break;
case 1:
cnt=0;
l=read(),r=read(),z=read();
ask(1,1,n,l,r,z);
if(cnt>1) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
break;
}
}
return 0;
}
原来洛谷上的CF914D还可以这么写
最新推荐文章于 2024-05-22 15:43:06 发布