```cpp
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n=read(),m=read(),a[100005],len=sqrt(m),sum[100005],l,r;
string ans[100005];
bitset<100005> s1,s2;
//bool s1[100005],s2[100005];
struct que{
int op,l,r,val,id,kuai;
}q[100005];
bool cmp(que x,que y){
if(x.kuai!=y.kuai)
return x.kuai<y.kuai;
return x.r<y.r;
}
void get(int x){
sum[a[x]]++;
if(sum[a[x]]==1)
s1[a[x]]=true,s2[100000-a[x]]=true;
}
void delet(int x){
sum[a[x]]--;
if(sum[a[x]]==0)
s1[a[x]]=s2[100000-a[x]]=false;
}
signed main(){
for(int i=1; i<=n; i++)
a[i]=read();
for(int i=1; i<=m; i++)
q[i].op=read(),q[i].l=read(),q[i].r=read(),q[i].val=read(),q[i].id=i,q[i].kuai=(l-1)/len+1;
sort(q+1,q+m+1,cmp);
for(int i=1; i<=m; i++){
while(l>q[i].l)
get(--l);
while(l<q[i].l)
delet(l++);
while(r>q[i].r)
delet(r--);
while(r<q[i].r)
get(++r);
int x=q[i].val;
if(q[i].op==1){
if((s1&(s1>>x)).any()==true)
ans[q[i].id]="hana\n";
else
ans[q[i].id]="bi\n";
}
else if(q[i].op==2){
if((s1&(s2>>(100000-x))).any()==true)
ans[q[i].id]="hana\n";
else
ans[q[i].id]="bi\n";
}
else{
bool f=false;
for(int j=1; j<=sqrt(x); j++)
if(x%j==0&&s1[j]==true&&s1[x/j]==true){
ans[q[i].id]="hana\n";
f=true;
break;
}
if(!f)
ans[q[i].id]="bi\n";
}
}
for(int i=1; i<=m; i++)
for(int j=0; j<ans[i].size(); j++)
putchar(ans[i][j]);
return 0;
}
```
by Nephren_Sakura @ 2022-07-27 17:23:51
@[_Chtholly_Nephren_](/user/400783) 速通:
`q[i].kuai=(l-1)/len+1;`
改
`q[i].kuai=(q[i].l-1)/len+1;`
by UnyieldingTrilobite @ 2022-07-27 17:54:49
@[UnyieldingTrilobite](/user/250637)
AC了,谢谢
此帖完结
by Nephren_Sakura @ 2022-07-27 18:40:12