#include <bits/stdc++.h>
#define ll long long int
#define inf 1e18
#define iosbase ios_base::sync_with_stdio(false);
#define mp make_pair
#define pb push_back
#define MOD 1000000007
#define sc(n) scanf("%d" , &n);
#define Max 100005
using namespace std;
typedef vector<ll> VI;
typedef map<ll , ll> MI;
int arr[Max],totalBlocks, k, seg[505][Max] , displace[505];
void create(int k , int n){
for(int i=0 ; i<n ; i++){
seg[i/k][arr[i]]++;
}
}
void update(int k , int low , int high , int x , int n){
int ind = low;
while((ind)%k!=0 && ind<=high){
seg[ind/k][arr[ind]]--;
arr[ind]= (arr[ind]+x)%n;
seg[ind/k][arr[ind]]++;
ind++;
}
while(ind+k <= high){
displace[ind/k] = (displace[ind/k]+x)%n;
ind+=k;
}
while(ind<=high){
seg[ind/k][arr[ind]]--;
arr[ind]= (arr[ind]+x)%n;
seg[ind/k][arr[ind]]++;
ind++;
}
}
int query(int k , int low , int high ,int x , int n){
int ind = low;
int ans=0;
while((ind)%k!=0 && ind<=high){
if( (arr[ind] + displace[ind/k])%n == x )ans++;
ind++;
}
while(ind+k <= high){
ans+= seg[ind/k][ (x-displace[ind/k] + n)%n ];
ind+=k;
}
while(ind<=high){
if( (arr[ind] + displace[ind/k])%n == x )ans++;
ind++;
}
return ans;
}
int main()
{
int n,q,a,low,hi,x;
sc(n);sc(q);
for(int i=0 ; i<n ; i++){
sc(arr[i]);
}
k = sqrt(n);
totalBlocks = ceil((double)n/k);
create(k,n);
while(q--)
{
sc(a);
if(a==1){
//update part
sc(low);sc(hi);sc(x);
update(k,low,hi,x,n);
}
else{
//query part
sc(low);sc(hi);sc(x);
int ans = query(k,low,hi,x,n);
printf("%d\n",ans);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAojZGVmaW5lIGluZiAxZTE4CiNkZWZpbmUgaW9zYmFzZSBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwojZGVmaW5lIHNjKG4pIHNjYW5mKCIlZCIgLCAmbik7CiNkZWZpbmUgTWF4IDEwMDAwNQp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIHZlY3RvcjxsbD4gVkk7CnR5cGVkZWYgbWFwPGxsICwgbGw+IE1JOwppbnQgYXJyW01heF0sdG90YWxCbG9ja3MsIGssIHNlZ1s1MDVdW01heF0gLCBkaXNwbGFjZVs1MDVdOwoKCnZvaWQgY3JlYXRlKGludCBrICwgaW50IG4pewoJZm9yKGludCBpPTAgOyBpPG4gOyBpKyspewoJCXNlZ1tpL2tdW2FycltpXV0rKzsKCX0KfQoKdm9pZCB1cGRhdGUoaW50IGsgLCBpbnQgbG93ICwgaW50IGhpZ2ggLCBpbnQgeCAsIGludCBuKXsKCglpbnQgaW5kID0gbG93OwoKCXdoaWxlKChpbmQpJWshPTAgJiYgaW5kPD1oaWdoKXsKCQlzZWdbaW5kL2tdW2FycltpbmRdXS0tOwoJCWFycltpbmRdPSAoYXJyW2luZF0reCklbjsKCQlzZWdbaW5kL2tdW2FycltpbmRdXSsrOwoJCWluZCsrOwoJfQoJd2hpbGUoaW5kK2sgPD0gaGlnaCl7CgkJZGlzcGxhY2VbaW5kL2tdID0gKGRpc3BsYWNlW2luZC9rXSt4KSVuOwoJCWluZCs9azsKCX0KCXdoaWxlKGluZDw9aGlnaCl7CgkJc2VnW2luZC9rXVthcnJbaW5kXV0tLTsKCQlhcnJbaW5kXT0gKGFycltpbmRdK3gpJW47CgkJc2VnW2luZC9rXVthcnJbaW5kXV0rKzsKCQlpbmQrKzsKCX0KCn0KCmludCBxdWVyeShpbnQgayAsIGludCBsb3cgLCBpbnQgaGlnaCAsaW50IHggLCBpbnQgbil7CgoJaW50IGluZCA9IGxvdzsKCWludCBhbnM9MDsKCgl3aGlsZSgoaW5kKSVrIT0wICYmIGluZDw9aGlnaCl7CgkJaWYoIChhcnJbaW5kXSArIGRpc3BsYWNlW2luZC9rXSklbiA9PSB4IClhbnMrKzsKCQlpbmQrKzsKCX0KCXdoaWxlKGluZCtrIDw9IGhpZ2gpewoJCWFucys9IHNlZ1tpbmQva11bICh4LWRpc3BsYWNlW2luZC9rXSArIG4pJW4gXTsKCQlpbmQrPWs7Cgl9Cgl3aGlsZShpbmQ8PWhpZ2gpewoJCWlmKCAoYXJyW2luZF0gKyBkaXNwbGFjZVtpbmQva10pJW4gPT0geCApYW5zKys7CgkJaW5kKys7Cgl9CglyZXR1cm4gYW5zOwp9CgoKaW50IG1haW4oKQp7CglpbnQgbixxLGEsbG93LGhpLHg7CglzYyhuKTtzYyhxKTsKCglmb3IoaW50IGk9MCA7IGk8biA7IGkrKyl7CgkJc2MoYXJyW2ldKTsKCX0KCglrID0gc3FydChuKTsKCXRvdGFsQmxvY2tzID0gY2VpbCgoZG91YmxlKW4vayk7CgoJY3JlYXRlKGssbik7CgoJd2hpbGUocS0tKQoJewoJCXNjKGEpOwoJCWlmKGE9PTEpewoKCQkJLy91cGRhdGUgcGFydAoJCQlzYyhsb3cpO3NjKGhpKTtzYyh4KTsKCQkJdXBkYXRlKGssbG93LGhpLHgsbik7CgkJfQoJCWVsc2V7CgoJCQkvL3F1ZXJ5IHBhcnQKCQkJc2MobG93KTtzYyhoaSk7c2MoeCk7CgkJCWludCBhbnMgPSBxdWVyeShrLGxvdyxoaSx4LG4pOwoJCQlwcmludGYoIiVkXG4iLGFucyk7CgkJfQoJfQoKCglyZXR1cm4gMDsKfQ==