#include <cstdio>
#include <cstring>
#include <cmath>
#include <cassert>
#include <bitset>
#include <array>
#include <algorithm>
using namespace std;
constexpr unsigned N=1e5+7,B=453;
int n,m,qc,bqc,mx;
int bb{448};
array<int,N> a;
array<bool,N> as;
struct Ds{
array<int,N> cnt;
bitset<N> v,iv;
inline void add(int x,int d){
if(d>0){
if(!cnt[x]) v.set(x),iv.set(mx-x);
++cnt[x];
}
else{
if(cnt[x]==1) v.reset(x),iv.reset(mx-x);
--cnt[x];
}
}
inline bool query(int t,int x){
switch(t){
case 1:{
return (v&(v>>x)).any();
}
case 2:{
return (v&(iv>>(mx-x))).any();
}
case 3:{
if(!x) return v.test(0);
for(int i{1};i*i<=x;++i){
if(!(x%i)&&v.test(i)&&v.test(x/i))
return true;
}
return false;
}
case 4:{
if(!x) return v.test(0);
for(int i{1};i*x<=100000;++i){
if(v.test(i)&&v.test(i*x))
return true;
}
return false;
}
}
return false;
}
}ds;
struct Qr{
int i,t,l,r,x;
}q[N],bq[N];
inline void tql(){
static int bl[B],br[B],pos[N];
int bs{max(1,(int)ceil(powl(n,0.50000)))},bc{n/bs+(n%bs!=0)};
int l,r,x,t,crtl{1},crtr{0};
for(int i{1};i<=bc;++i) bl[i]=br[i-1]+1,br[i]=min(n,bl[i]+bs-1),fill(pos+bl[i],pos+br[i]+1,i);
sort(q+1,q+qc+1,[](const Qr &a,const Qr &b){return (pos[a.l]!=pos[b.l])?(a.l<b.l):(a.r<b.r);});
for(int i{1};i<=qc;++i){
l=q[i].l,r=q[i].r,
x=q[i].x,t=q[i].t;
while(crtl>l) ds.add(a[--crtl],1);
while(crtr<r) ds.add(a[++crtr],1);
while(crtl<l) ds.add(a[crtl++],-1);
while(crtr>r) ds.add(a[crtr--],-1);
as[q[i].i]=ds.query(t,x);
}
}
inline void brfc(){
static array<int,N> pos;
static array<int,N> lst;
int crt{1};
for(int i{1};i<=n;++i){
pos[a[i]]=i;
for(int j{0};j<=bb;++j){
int t{a[i]*j};
if(t>100003) break;
if(pos[t]) lst[j]=max(lst[j],pos[t]);
}
for(int j{1};j<=bb;++j){
if(a[i]%j) break;
int t{a[i]/j};
if(pos[t]) lst[j]=max(lst[j],pos[t]);
}
while(crt<=bqc&&bq[crt].r==i){
int p{bq[crt].i},l{bq[crt].l},x{bq[crt].x};
// printf("query[%d]=%d,%d,%d,lst[%d]=%d\n",p,l,i,x,x,lst[x]);
as[p]=(l<=lst[x]);
++crt;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i{1};i<=n;++i) scanf("%d",&a[i]),mx=max(mx,a[i]);
for(int i{1};i<=m;++i){
int t,l,r,x;
scanf("%d%d%d%d",&t,&l,&r,&x);
if(t==4&&x<=bb){
bq[++bqc]=Qr{i,t,l,r,x};
continue;
}
++qc;
q[qc]={i,t,l,r,x};
mx=max(mx,x);
}
++mx;
sort(bq+1,bq+bqc+1,
[](const Qr &a,const Qr &b)->bool{
if(a.r!=b.r) return a.r<b.r;
if(a.x!=b.x) return a.x<b.x;
return a.l<b.l;
}
);
brfc();
tql();
for(int i{1};i<=m;++i) puts(as[i]?"yuno":"yumi");
return 0;
}
/*
a+b=x
i&&x-i
x-i=(INF-i)-(INF-x)
a-b=x
i&&i-x
a/b=x
a=bx
s1.枚举b,vst[b]&&vst[bx],bx<=1e5,b<=1e5/x
s2.扫一遍,维护vst,lst[t]=max j,[j,i]contains b,bt;对于q(l,r=i,x),ans=[l<=lst[x]]
*/
数据水,把 if(t==4&&x<=bb){ 的 bb 改成 2 能过。
确定是 brfc 函数的问题。