P3674 小清新人渣的本愿
P3674 小清新人渣的本愿
一道妙不可言的题啊,,,
一看就知道是个莫队
考虑求答案
1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and\ (S\ shr\ x)\)不为空,就有解
考虑2号操作,\(a+b=c\)可以转化为\((10w-b)-a=10w-c\),然后维护一个反的bitset,套路一样
3号操作。。。emmm。。。只需要暴力枚举因数,,,复杂度很对
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<bitset>
#include<cmath>
#define il inline
#define rg register
#define vd void
#define sta static
typedef long long ll;
using namespace std;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=100100;
bitset<maxn>T,rT;
int tot[maxn];
int a[maxn];
bool ans[maxn];
int B[maxn];
struct ques{int o,l,r,x,id;}q[maxn];
bool operator <(const ques&a,const ques&b){
if(B[a.l]!=B[b.l])return B[a.l]<B[b.l];
return B[a.r]<B[b.r];
}
il vd fuck(int x,int y){
if(tot[x]==0&&y==1)T[x]=1,rT[100000-x]=1;
if(tot[x]==1&&y==-1)T[x]=0,rT[100000-x]=0;
tot[x]+=y;
}
int main(){
#ifdef xzz
freopen("3674.in","r",stdin);
freopen("3674.out","w",stdout);
#endif
int n=gi(),m=gi();
for(rg int i=1;i<=n;++i)a[i]=gi();
for(rg int i=1;i<=m;++i)q[i]=(ques){gi(),gi(),gi(),gi(),i};
B[0]=sqrt(n);
for(rg int i=1;i<=n;++i)B[i]=i/B[0];
sort(q+1,q+m+1);
int l=1,r=1;
T[a[1]]=1;rT[100000-a[1]]=1;tot[a[1]]=1;
for(rg int i=1;i<=m;++i){
while(q[i].l<l)--l,fuck(a[l],1);
while(q[i].r<r)fuck(a[r],-1),--r;
while(q[i].r>r)++r,fuck(a[r],1);
while(q[i].l>l)fuck(a[l],-1),++l;
if(q[i].o==1)ans[q[i].id]=(T&(T>>(q[i].x))).any();
else if(q[i].o==2)ans[q[i].id]=((T)&(rT>>(100000-q[i].x))).any();
else if(q[i].o==3){
if(q[i].x==0)ans[q[i].id]=(bool)T[0];
else{
int j=1;
while(j*j<=q[i].x){
if(q[i].x%j==0&&(tot[j])&&(tot[q[i].x/j])){ans[q[i].id]=1;break;}
++j;
}
}
}
}
for(rg int i=1;i<=m;++i)puts(ans[i]?"hana":"bi");
return 0;
}
博主是蒟蒻,有问题请指出,谢谢!
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。
本博客中博文均为原创,未经博主允许请勿随意转载,谢谢。