#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5, BL = 31 - __builtin_clz(sqrt(maxn));
bitset<maxn+10> b1,b2,ans;
struct Q{ int l,r,opt,x,i; }q[maxn+10];
int n,m,a[maxn+10],c[maxn+10],l=1,r=0,las[maxn+10],pos[1<<BL][maxn+10];
inline void add(int v) { if(!c[v]++) b1.set(v),b2.set(maxn-v); }
inline void del(int v) { if(!--c[v]) b1.reset(v),b2.reset(maxn-v); }
inline bool subable(int x) { return (b1 << x & b1).any(); }
inline bool addable(int x) { return (b1 << maxn - x & b2).any(); }
inline bool mulable(int x) {
for(int d = 1;d*d<=x;++d)
if(!(x%d) && b1.test(d) && b1.test(x/d)) return 1;
return 0;
}
inline bool divable(int x) {
if(x>>BL) {
for(int i = 1;i*x<=maxn;++i) if(b1.test(i) && b1.test(i*x)) return 1;
return 0;
}
return pos[x][r] >= l;
}
inline void init(int x) {
int *pos = ::pos[x];
memset(las,0,sizeof(las[0]) * (maxn+1));
for(int i = 1;i<=n;++i) {
las[a[i]] = i;
pos[i] = pos[i-1];
if(!(a[i] % x)) pos[i] = max(pos[i],las[a[i]/x]);
if(a[i]*x<=maxn) pos[i] = max(pos[i],las[a[i]*x]);
}
}
signed main() {
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
for(int i = 1;i<=n;++i) cin>>a[i];
for(int i = 1;i<=m;++i) cin>>q[i].opt>>q[i].l>>q[i].r>>q[i].x,q[i].i = i;
sort(q+1,q+m+1,[](Q a,Q b){ return (a.l>>BL) == (b.l>>BL) && a.r != b.r ? (a.r < b.r) ^ (a.l>>BL & 1) : a.l < b.l; });
for(int i = 1;i<(1<<BL);++i) init(i);
for(int i = 1;i<=m;++i) {
while(l > q[i].l) add(a[--l]);
while(r < q[i].r) add(a[++r]);
while(l < q[i].l) del(a[l++]);
while(r > q[i].r) del(a[r--]);
const int x = q[i].x;
switch(q[i].opt) {
case 1: if(subable(x)) ans.set(q[i].i); break;
case 2: if(addable(x)) ans.set(q[i].i); break;
case 3: if(mulable(x)) ans.set(q[i].i); break;
case 4: if(divable(x)) ans.set(q[i].i); break;
}
}
for(int i = 1;i<=m;++i) cout<<(ans.test(i)?"yuno\n":"yumi\n");
}
使用如下数据生成器:
#include<bits/stdc++.h>
#define time(var) (std::chrono::system_clock::now().time_since_epoch()).count()
#define rand(a,b) (uniform_int_distribution<long long>(a, b))(randen)
std::mt19937 randen(time(0));
using namespace std;
const int maxn = 1e5;
signed main() {
freopen("a.in","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
int n = maxn,m = maxn;
cout<<n<<' '<<m<<'\n';
for(int i = 1;i<=n;++i) cout<<rand(1,maxn)<<' ';
for(int i = 1;i<=m;++i) {
cout<<rand(1,4);
int l = rand(1,maxn),r = rand(l,maxn);
cout<<' '<<l<<' '<<r<<' '<<rand(0,maxn)<<' ';
}
}
竟然无法对拍出来错误!