#include<bits/stdc++.h>
using namespace std;
// Numeric Constants
#define N 1000000007
#define maxs 100005
#define mins 505
#define eps 0.000000000001
#define imax 2000000200
#define llmax 1000000002000000000ll
#define pi 3.141592653589793
// Others
#define ll long long
#define pb push_back
#define gc getchar_unlocked
#define iosbase ios_base::sync_with_stdio(false)
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ppi pair<pair<int,int>,int>
#define ppl pair<pll,ll>
#define vi vector<int>
#define sc scanf
#define pr printf
#define lld I64d
#define F first
#define S second
#define siter set<int>::iterator
#define p_pq priority_queue
#define ub upper_bound
#define lb lower_bound
int rotation[mins],freq[mins][maxs],a[maxs];
int main()
{
int n,q,l,r,sblock,endblock,ans,type,x,i,noblocks,blsize,j;
sc("%d %d",&n,&q);
for(i=0;i<n;i++){
sc("%d",&a[i]);
}
blsize=sqrt(n);
noblocks=ceil((double)n/blsize);
for(i=0;i<noblocks;i++){
for(j=i*blsize;j<min((i+1)*blsize,n);j++){
freq[i][a[j]]++;
}
}
while(q--){
sc("%d %d %d %d",&type,&l,&r,&x);
if(type==2){
sblock=l/blsize;
endblock=r/blsize;
if(sblock==endblock){
ans=0;
for(i=l;i<=r;i++){
if(((x-rotation[sblock]+n)%n)==a[i]){
ans++;
}
}
}
else{
ans=0;
for(i=l;i<(sblock+1)*blsize;i++){
if(((x-rotation[sblock]+n)%n)==a[i]){
ans++;
}
}
for(i=endblock*blsize;i<=r;i++){
if(((x-rotation[endblock]+n)%n)==a[i]){
ans++;
}
}
for(i=sblock+1;i<=endblock-1;i++){
ans+=freq[i][(x-rotation[i]+n)%n];
}
}
pr("%d\n",ans);
}
else{
sblock=l/blsize;
endblock=r/blsize;
if(sblock==endblock){
ans=0;
for(i=l;i<=r;i++){
freq[sblock][a[i]]--;
a[i]=(a[i]+x)%n;
freq[sblock][a[i]]++;
}
}
else{
ans=0;
for(i=l;i<(sblock+1)*blsize;i++){
freq[sblock][a[i]]--;
a[i]=(a[i]+x)%n;
freq[sblock][a[i]]++;
}
for(i=endblock*blsize;i<=r;i++){
freq[endblock][a[i]]--;
a[i]=(a[i]+x)%n;
freq[endblock][a[i]]++;
}
for(i=sblock+1;i<=endblock-1;i++){
rotation[i]=(rotation[i]+x)%n;
}
}
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIE51bWVyaWMgQ29uc3RhbnRzCiNkZWZpbmUgTiAxMDAwMDAwMDA3CiNkZWZpbmUgbWF4cyAxMDAwMDUKI2RlZmluZSBtaW5zIDUwNQojZGVmaW5lIGVwcyAwLjAwMDAwMDAwMDAwMQojZGVmaW5lIGltYXggMjAwMDAwMDIwMAojZGVmaW5lIGxsbWF4IDEwMDAwMDAwMDIwMDAwMDAwMDBsbAojZGVmaW5lIHBpIDMuMTQxNTkyNjUzNTg5NzkzCgovLyBPdGhlcnMKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBnYyBnZXRjaGFyX3VubG9ja2VkCiNkZWZpbmUgaW9zYmFzZSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKQojZGVmaW5lIHBpaSBwYWlyPGludCxpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bGwsbGw+CiNkZWZpbmUgcHBpIHBhaXI8cGFpcjxpbnQsaW50PixpbnQ+CiNkZWZpbmUgcHBsIHBhaXI8cGxsLGxsPgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgc2Mgc2NhbmYKI2RlZmluZSBwciBwcmludGYKI2RlZmluZSBsbGQgSTY0ZAojZGVmaW5lIEYgZmlyc3QKI2RlZmluZSBTIHNlY29uZAojZGVmaW5lIHNpdGVyIHNldDxpbnQ+OjppdGVyYXRvcgojZGVmaW5lIHBfcHEgcHJpb3JpdHlfcXVldWUKI2RlZmluZSB1YiB1cHBlcl9ib3VuZAojZGVmaW5lIGxiIGxvd2VyX2JvdW5kCgppbnQgcm90YXRpb25bbWluc10sZnJlcVttaW5zXVttYXhzXSxhW21heHNdOwoKaW50IG1haW4oKQp7CglpbnQgbixxLGwscixzYmxvY2ssZW5kYmxvY2ssYW5zLHR5cGUseCxpLG5vYmxvY2tzLGJsc2l6ZSxqOwoJc2MoIiVkICVkIiwmbiwmcSk7Cglmb3IoaT0wO2k8bjtpKyspewoJCXNjKCIlZCIsJmFbaV0pOwoJfQoJYmxzaXplPXNxcnQobik7Cglub2Jsb2Nrcz1jZWlsKChkb3VibGUpbi9ibHNpemUpOwoJZm9yKGk9MDtpPG5vYmxvY2tzO2krKyl7CgkJZm9yKGo9aSpibHNpemU7ajxtaW4oKGkrMSkqYmxzaXplLG4pO2orKyl7CgkJCWZyZXFbaV1bYVtqXV0rKzsKCQl9Cgl9Cgl3aGlsZShxLS0pewoJCXNjKCIlZCAlZCAlZCAlZCIsJnR5cGUsJmwsJnIsJngpOwoJCWlmKHR5cGU9PTIpewoJCQlzYmxvY2s9bC9ibHNpemU7CgkJCWVuZGJsb2NrPXIvYmxzaXplOwoJCQlpZihzYmxvY2s9PWVuZGJsb2NrKXsKCQkJCWFucz0wOwoJCQkJZm9yKGk9bDtpPD1yO2krKyl7CgkJCQkJaWYoKCh4LXJvdGF0aW9uW3NibG9ja10rbiklbik9PWFbaV0pewoJCQkJCQlhbnMrKzsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZXsKCQkJCWFucz0wOwoJCQkJZm9yKGk9bDtpPChzYmxvY2srMSkqYmxzaXplO2krKyl7CgkJCQkJaWYoKCh4LXJvdGF0aW9uW3NibG9ja10rbiklbik9PWFbaV0pewoJCQkJCQlhbnMrKzsKCQkJCQl9CgkJCQl9CgkJCQlmb3IoaT1lbmRibG9jaypibHNpemU7aTw9cjtpKyspewoJCQkJCWlmKCgoeC1yb3RhdGlvbltlbmRibG9ja10rbiklbik9PWFbaV0pewoJCQkJCQlhbnMrKzsKCQkJCQl9CgkJCQl9CgkJCQlmb3IoaT1zYmxvY2srMTtpPD1lbmRibG9jay0xO2krKyl7CgkJCQkJYW5zKz1mcmVxW2ldWyh4LXJvdGF0aW9uW2ldK24pJW5dOwoJCQkJfQoJCQl9CgkJCXByKCIlZFxuIixhbnMpOwoJCX0KCQllbHNlewoJCQlzYmxvY2s9bC9ibHNpemU7CgkJCWVuZGJsb2NrPXIvYmxzaXplOwoJCQlpZihzYmxvY2s9PWVuZGJsb2NrKXsKCQkJCWFucz0wOwoJCQkJZm9yKGk9bDtpPD1yO2krKyl7CgkJCQkJZnJlcVtzYmxvY2tdW2FbaV1dLS07CgkJCQkJYVtpXT0oYVtpXSt4KSVuOwoJCQkJCWZyZXFbc2Jsb2NrXVthW2ldXSsrOwoJCQkJfQoJCQl9CgkJCWVsc2V7CgkJCQlhbnM9MDsKCQkJCWZvcihpPWw7aTwoc2Jsb2NrKzEpKmJsc2l6ZTtpKyspewoJCQkJCWZyZXFbc2Jsb2NrXVthW2ldXS0tOwoJCQkJCWFbaV09KGFbaV0reCklbjsKCQkJCQlmcmVxW3NibG9ja11bYVtpXV0rKzsKCQkJCX0KCQkJCWZvcihpPWVuZGJsb2NrKmJsc2l6ZTtpPD1yO2krKyl7CgkJCQkJZnJlcVtlbmRibG9ja11bYVtpXV0tLTsKCQkJCQlhW2ldPShhW2ldK3gpJW47CgkJCQkJZnJlcVtlbmRibG9ja11bYVtpXV0rKzsKCQkJCX0KCQkJCWZvcihpPXNibG9jaysxO2k8PWVuZGJsb2NrLTE7aSsrKXsKCQkJCQlyb3RhdGlvbltpXT0ocm90YXRpb25baV0reCklbjsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiAwOwp9