这题是莫队维护bitset。

然而我并不会bitset以前讲过认为不考就没学

我真的太菜了。

首先维护一个权值的bitset——s。

操作3比较简单,我们可以\(\sqrt{x}\)枚举约数然后判断就行了。

操作1就是求是否存在

\[\exists{a,b},a-b=x
\]

移一下项

\[a=x+b
\]

也就是\(\text{(s<<x)}\)&\(x\neq0\)。

那么操作2该怎么办?

我们先设\(b'=n-b\)因为\(x=a+b\)

\[a-b'=a-(n-b)=a+b-n=x-n
\]

然后类比操作1就行了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<bitset>
using namespace std;
const int N=100101;
int n,m,a[N],block[N],cnt[N];
string ans[N];
struct ques{
int l,r,type,id,x;
}qu[N];
bool cmp(ques a,ques b){
if(block[a.l]==block[b.l])return a.r<b.r;
else return block[a.l]<block[b.l];
}
bitset<N> x,y;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int main(){
n=read();m=read();
int Block=sqrt(n);
for(int i=1;i<=n;i++)a[i]=read(),block[i]=(i-1)/Block+1;
for(int i=1;i<=m;i++)qu[i].type=read(),qu[i].l=read(),qu[i].r=read(),qu[i].x=read(),qu[i].id=i;
sort(qu+1,qu+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
while(r<qu[i].r){
r++;
cnt[a[r]]++;
if(cnt[a[r]]==1)x[a[r]]=1,y[n-a[r]]=1;
}
while(l>qu[i].l){
l--;
cnt[a[l]]++;
if(cnt[a[l]]==1)x[a[l]]=1,y[n-a[l]]=1;
}
while(r>qu[i].r){
if(cnt[a[r]]==1)x[a[r]]=0,y[n-a[r]]=0;
cnt[a[r]]--;
r--;
}
while(l<qu[i].l){
if(cnt[a[l]]==1)x[a[l]]=0,y[n-a[l]]=0;
cnt[a[l]]--;
l++;
}
if(qu[i].type==1){
if((x&(x<<qu[i].x)).any())ans[qu[i].id]="hana";
else ans[qu[i].id]="bi";
}
else if(qu[i].type==2){
if(qu[i].x-n>=0){
if(((y<<(qu[i].x-n))&x).any())ans[qu[i].id]="hana";
else ans[qu[i].id]="bi";
}
else{
if(((x<<(n-qu[i].x))&y).any())ans[qu[i].id]="hana";
else ans[qu[i].id]="bi";
}
}
else{
for(int j=1;j<=sqrt(qu[i].x);j++)
if(qu[i].x%j==0&&x[j]&&x[qu[i].x/j])ans[qu[i].id]="hana";
if(ans[qu[i].id]!="hana")ans[qu[i].id]="bi";
}
}
for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
return 0;
}

最新文章

  1. (原).NET程序加入多语言包解决方案工具,超级棒
  2. Android开发学习之路-该怎么学Android(Service和Activity通信为例)
  3. C++ 传参数 拉起程序
  4. HDU 3844 Mining Your Own Business
  5. ci配置smarty手记
  6. 单点登录系统构建之二——SSO原理及CAS架构
  7. Python---十年语言之首
  8. js--小结③
  9. poj 3154 Graveyard 贪心
  10. poj 1486 Sorting Slides(二分图匹配的查找应用)
  11. ID卡学习笔记
  12. OpenGL直线点画模式
  13. 关于iOS常用的26中公共方法,可copy的代码
  14. 安装linux
  15. SQL server 2012安装中出现的INSTALLSHAREDDIR 和 INSTALLSHAREDWOWDIR 参数具有相同的值问题
  16. Netty多人聊天室
  17. windows redis 连接错误Creating Server TCP listening socket 127.0.0.1:637 9: bind: No error
  18. bzoj3884 上帝的集合
  19. 【正则表达式1】C++11正则表达式
  20. JAVA反射机制教程-获取类对象

热门文章

  1. cache(缓存)的作用
  2. Vim 学习指南
  3. windows下一台机器运行多个tomcat
  4. [JZOJ]100047. 【NOIP2017提高A组模拟7.14】基因变异
  5. 查看Linux系统信息命令
  6. 20130907.Git学习记录
  7. win10开机时内存使用率达到99%以上
  8. HDU 4314 Contest 2
  9. java 基础概念 -- 数组与内存控制
  10. 四旋翼飞行器Quadrotor飞控之 PID调节(參考APM程序)