其他点都是 WA。
与题解主要不同的地方,在于我 bitset 用的原点,分正负,所以开了两倍空间。
尝试改了一下题解的打法,好像没用?
有没有大佬帮忙看一看。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5,maxm=1e5+5,maxc=1e5+5;
const int ADD=1e5;
int n,m,a[maxn];
int bel[maxn],cnt[maxn];
bool ans[maxm];
struct query {
int op,l,r,x,id;
}q[maxm];
bitset<maxc*2>b,c;
bool cmp(query a,query b) {
return (bel[a.l]^bel[b.l]?bel[a.l]<bel[b.l]:(bel[a.l]&1?a.r<b.r:a.r>b.r));
}
inline int read() {
char ch=getchar();
int x=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
void add(int x) {
cnt[a[x]]++;
b[a[x]+ADD]=true;
c[ADD-a[x]]=true;
}
void del(int x) {
cnt[a[x]]--;
if(!cnt[a[x]]) b[a[x]+ADD]=false,c[ADD-a[x]]=false;
else b[a[x]+ADD]=true,c[ADD-a[x]]=true;
}
int main() {
n=read(),m=read();
int siz=sqrt(n);
for(int i=1;i<=n;i++)
a[i]=read(),bel[i]=(i-1)/siz+1;
for(int i=1;i<=m;i++)
q[i]={read(),read(),read(),read(),i};
sort(q+1,q+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++) {
int ql=q[i].l,qr=q[i].r,op=q[i].op,x=q[i].x;
while(l<ql) del(l++);
while(l>ql) add(--l);
while(r<qr) add(++r);
while(r>qr) del(r--);
if(op==1) {
if((b&(b<<x)).any()) ans[q[i].id]=true;
}
else if(op==2) {
if((b&(c<<x)).any()) ans[q[i].id]=true;
}
else
for(int j=1;j*j<=x;j++)
if(x%j==0)
if(cnt[j]&&cnt[x/j]) {
ans[q[i].id]=true;
break;
}
}
for(int i=1;i<=m;i++)
if(ans[i]) puts("hana");
else puts("bi");
return 0;
}