WA on 2、3、4、6、11。
#include<cmath>
#include<cstdio>
#include<cstring>
#define mn 1000005
#define mm 500005
#define xx 100005
#define mt 1005
#define reg register
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
int a[mn],bl[mn],l[mt],r[mt],ans[mm];
int mx,del,b[xx],pa[mn],cnt[xx];
struct node {
int opt,l,r,x;
} o[mm];
inline int read() {
reg int temp=0;
reg char ch=getchar();
for(; ch<'0'||ch>'9'; ch=getchar()) ;
for(; ch>='0'&&ch<='9'; ch=getchar()) temp=(temp<<1)+(temp<<3)+(ch^48);
return temp;
}
inline void build(reg int le,reg int ri) {
reg int i;
del=mx=0;
for(i=le; i<=ri; ++i) {
mx=max(mx,a[i]);
if(!b[a[i]]) b[a[i]]=i;
++cnt[a[i]];
pa[i]=b[a[i]];
}
}
inline int find(reg int x) {
for(; x!=pa[x]; x=pa[x]) ;
return x;
}
int main() {
reg int n,m,t,i,j,blo,le,ri,x;
n=read();
m=read();
t=sqrt(n);
for(i=1; i<=n; ++i) a[i]=read();
for(i=1; i<=n; ++i) bl[i]=(i-1)/t+1;
for(blo=1; blo<=bl[n]; ++blo) l[blo]=r[blo-1]+1,r[blo]=r[blo-1]+t;
r[bl[n]]=n;
for(i=1; i<=m; ++i) o[i]={read(),read(),read(),read()};
for(blo=1; blo<=bl[n]; ++blo) {
build(l[blo],r[blo]);
for(i=1; i<=m; ++i) {
le=max(o[i].l,l[blo]);
ri=min(o[i].r,r[blo]);
if(le>ri) continue;
x=o[i].x;
switch(o[i].opt) {
case 1:
if(le==l[blo]&&ri==r[blo]) {
if(mx-del<=x) break;
if(mx-del>=(x<<1)) {
for(j=x; j!=-1; --j) {
if(!b[j+del]) continue;
if(b[j+x+del]) pa[b[j+del]]=b[j+x+del],cnt[j+x+del]+=cnt[j+del];
else a[b[j+del]]=j+x+del,cnt[j+x+del]=cnt[j+del],b[j+x+del]=b[j+del];
b[j+del]=cnt[j+del]=0;
}
del+=x;
break;
}
for(j=x+1; j+del<=mx; ++j) {
if(!b[j+del]) continue;
if(b[j+del-x]) pa[b[j+del]]=b[j+del-x],cnt[j+del-x]+=cnt[j+del];
else a[b[j+del]]=j+del-x,cnt[j+del-x]=cnt[j+del],b[j+del-x]=b[j+del];
b[j+del]=cnt[j+del]=0;
}
for(j=x; j; --j)
if(b[j+del]) {
mx=j+del;
break;
}
} else {
for(j=l[blo]; j<=r[blo]; ++j)
a[j]=a[find(j)],b[a[j]]=cnt[a[j]]=0;
for(j=l[blo]; j<=r[blo]; ++j)
a[j]-=del;
for(j=le; j<=ri; ++j)
if(a[j]>x) a[j]-=x;
build(l[blo],r[blo]);
}
break;
case 2:
if(le==l[blo]&&ri==r[blo]) ans[i]+=cnt[x+del];
else {
for(j=le; j<=ri; ++j) if(a[find(j)]==x+del) ++ans[i];
}
break;
}
}
for(i=l[blo]; i<=r[blo]; ++i)
b[a[i]]=cnt[a[i]]=0;
}
for(i=1; i<=m; ++i) if(o[i].opt==2) printf("%d\n",ans[i]);
return 0;
}