#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100010
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;i++)
using namespace std;

int n,m,c,r,t,g,y,z,x,sq;
int num[maxn],fa[maxn],rt[320][maxn],a[maxn],b[maxn],pos[maxn],tag[maxn],ans[maxn],maxx[maxn];

inline void in(int &x){
    x=0;int f=1;char c=getchar();
    while(c<'0'||c>'9'){
        if(c==-1) return;
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c<='9'&&c>='0'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    x=x*f;
}

inline void out(int a){
    if(a<0){
        a*=-1;
        putchar('-');
    } 
    if(a>=10)out(a/10);
    putchar(a%10+'0');
}

int find(int x){ 
	if(x!=fa[x])
	  fa[x]=find(fa[x]);
	return fa[x];
}

void pre(int x){ 
	maxx[x]=0;
	FOR(i,(x-1)*sq+1,min(x*sq,n)){
		if(a[i]>maxx[x]) 
		  maxx[x]=a[i];
		num[i]=1;
		if(rt[x][a[i]]!=0){
			num[rt[x][a[i]]]+=num[i];
			fa[i]=rt[x][a[i]];
		}
		else{
			pos[i]=a[i];
			rt[x][a[i]]=i;
			fa[i]=i;
		}
	}
}

void del(int x){ 
	FOR(i,(x-1)*sq+1,x*sq){
		a[i]=pos[find(i)];
		rt[x][a[i]]=0;
		a[i]-=tag[x];
	}
	FOR(i,(x-1)*sq+1,x*sq)
	  fa[i]=0;
	tag[x]=0;
}

void solve(int x,int z){ 
	if(maxx[x]-tag[x]>=2*z){
		FOR(i,tag[x]+1,tag[x]+z){
			if(rt[x][i]){
		  		if(rt[x][i+z]!=0){
		  			num[rt[x][i+z]]+=num[rt[x][i]];
		  			fa[rt[x][i]]=rt[x][i+z];
				}
				else{
					rt[x][i+z]=rt[x][i];
					pos[rt[x][i]]=i+z;
				}
		  		rt[x][i]=0;
		  	}
		}
		tag[x]+=z;  
	}
	else{
		FOR(i,tag[x]+z+1,maxx[x]){
			if(rt[x][i]){
				if(rt[x][i-z]!=0){
					num[rt[x][i-z]]+=num[rt[x][i]];
					fa[rt[x][i]]=rt[x][i-z];
				}
				else{
					rt[x][i-z]=rt[x][i];
					pos[rt[x][i]]=i-z;
				}
				rt[x][i]=0;
			}
		}
		maxx[x]=min(maxx[x],tag[x]+z);
	}
}

void doit(int x,int y,int z){ 
    del(b[x]);
    FOR(i,x,min(y,b[x]*sq)){
    	if(a[i]>z) 
        a[i]-=z;	
	} 
	pre(b[x]);
    if(b[x]!=b[y]){
    	del(b[y]);
    	FOR(i,(b[y]-1)*sq+1,y){
      	  if(a[i]>z)
                a[i]-=z;
		} 
		pre(b[y]);
	}
    FOR(i,b[x]+1,b[y]-1){
    	solve(i,z);
	}
}

int query(int x,int y,int z){
	int anss=0;
	FOR(i,x,min(b[x]*sq,y))
	  if(pos[find(i)]==z+tag[b[x]])
	    anss++;
	if(b[x]!=b[y])
	  FOR(i,(b[y]-1)*sq+1,y)
	    if(pos[find(i)]==z+tag[b[y]])
	      anss++;
	FOR(i,b[x]+1,b[y]-1){
		anss+=num[rt[i][z+tag[i]]];
	}
	return anss;
}

int main(){
	in(n),in(m);
	sq=sqrt(n);
	FOR(i,1,n)
	  in(a[i]);
	FOR(i,1,n)
	  b[i]=(i-1)/sq+1;
    FOR(i,1,b[n]){
    	pre(i);
	}
	FOR(i,1,m){
		in(t),in(x),in(y),in(z);
		if(t==1){
			doit(x,y,z);
		}
		else{
			out(query(x,y,z));
			puts("");
		}
	}
}
