WA On test #1 and #3, 求助
另外, 整个序列貌似都没有 0, 数据是真的 [数据删除]
#include<bits/stdc++.h>
// #define int long long
using namespace std;
inline int read(void) {
register int x=0,sgn=1,ch;
while(ch<48||57<ch) {if(ch==45)sgn=0;ch=getchar();}
while(47<ch&&ch<58) {x=x*10+ch-48; ch=getchar();}
return sgn? x:-x;
}
int n,m,blk,l1,r1,opt,x1,mx,mxa,cntq;
int cnt[100005],srl[100005],ans[100005],lst[100005],res[100005];
struct Qry {
int l,r,x,typ,bel,dfn;
inline bool operator < (Qry x) {
return bel^x.bel ? bel<x.bel : (r<x.r) xor (bel&1);
}
Qry(int _typ=0,int _l=0,int _r=0,int _x=0,int _bel=0,int _dfn=0) :typ(_typ), l(_l), r(_r), x(_x), bel(_bel), dfn(_dfn){}
} qry[100005];
struct query_ {
int l,r,dfn;
query_(int _l=0,int _r=0,int _dfn=0) :l(_l), r(_r), dfn(_dfn){}
};
std::vector <query_> query[350];
std::bitset <100010> ext,mis;
inline void add(const int &x) {
if(!cnt[x]) {
ext[x]=true;
if(x<=mx) mis[mx-x]=true;
}
++cnt[x];
}
inline void del(const int &x) {
--cnt[x];
if(!cnt[x]) {
ext[x]=false;
if(x<=mx) mis[mx-x]=false;
}
}
signed main() {
n=read(),m=read();
blk=n/sqrt(m)/0.95;
for(register int i=1; i<=n; ++i) srl[i]=read(),mxa=std::max(mxa,srl[i]);
int sqt=sqrt(mxa);
for(register int i=1; i<=m; ++i) {
opt=read(),l1=read(),r1=read(),x1=read();
if(opt==2) mx=std::max(mx,x1);
if(opt==4&&x1<=sqt) {
query[x1].push_back(query_(l1,r1,i));
continue;
}
qry[++cntq]=Qry(opt,l1,r1,x1,l1/blk+1,i);
}
if(!query[0].empty()) assert(0);
if(!query[0].empty()) {
for(register int i=1; i<=n; ++i) {
if(srl[i]) lst[i]=i,res[i]=res[i-1];
else res[i]=i,lst[i]=lst[i-1];
}
int sss=query[0].size();
// for(register int i=0; i<sss; ++i) ans[query[0][i].dfn]=(res[query[0][i].r]>=query[0][i].l&&lst[query[0][i].r]>=query[0][i].l);
}
// int sss=query[0].size();
// for(register int i=0; i<sss; ++i) ans[query[0][i].dfn]=1;
for(register int x=1; x<=sqt; ++x) {
if(query[x].empty()) continue;
memset(res,0,sizeof res);
memset(lst,0,sizeof lst);
for(register int i=1; i<=n; ++i) {
lst[srl[i]]=i,res[i]=res[i-1];
if(srl[i]*x<=mxa) res[i]=max(res[i],lst[srl[i]*x]);
if(srl[i]%x== 0 ) res[i]=max(res[i],lst[srl[i]/x]);
}
int sss=query[x].size();
for(register int i=0; i<sss; ++i) ans[query[x][i].dfn]=(res[query[x][i].r]>=query[x][i].l);
}
sort(qry+1,qry+cntq+1);
register int l=1,r=0;
for(register int i=1; i<=cntq; ++i) {
while(r<qry[i].r) add(srl[++r]);
while(l>qry[i].l) add(srl[--l]);
while(r>qry[i].r) del(srl[r--]);
while(l<qry[i].l) del(srl[l++]);
if(qry[i].typ==1) ans[qry[i].dfn]=(ext&(ext>>qry[i].x)).any();
if(qry[i].typ==2) ans[qry[i].dfn]=(ext&(mis>>(mx-qry[i].x))).any();
if(qry[i].typ==3) {
int s=sqrt(qry[i].x);
if(qry[i].x) ans[qry[i].dfn]=ext[0];
else for(register int k=1; k<=s; ++k) {
if(qry[i].x%k) continue;
if(ext[qry[i].x/k]&&ext[k]) {
ans[qry[i].dfn]=1;
break;
}
}
}
if(qry[i].typ==4) {
if(qry[i].x<sqt) continue;
int s=mxa/qry[i].x;
for(register int k=1; k<=s; ++k) {
if(ext[k]&&ext[k*qry[i].x]) {
ans[qry[i].dfn]=1;
break;
}
}
}
}
for(register int i=1; i<=m; ++i) puts(ans[i] ? "yuno" : "yumi");
return 0;
}