#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=2000000;
int add[maxn],l[maxn],r[maxn],sum[maxn],b[maxn],a[maxn];
int n,m,len,tot,ans;
int cop[maxn];
/*void work(int l,int r,int z)
{
int mid;
while(l<=r)
{
mid=(l+r)>>1;
if(cop[mid]<z)
{
l=mid+1;
}
else r=mid-1;
}
ans+=r-l+1;
}*/
void worki(int x)
{
for(int i=l[b[x]];i<=r[b[x]];i++)
{
cop[i]=a[i];
}
sort(cop+l[b[x]],cop+r[b[x]]+1);
}
int main()
{
scanf("%d%d",&n,&m);
len=sqrt(n);
tot=n/len;
if(n%len) tot++;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
cop[i]=a[i];
b[i]=(i-1)/len+1;
//sum[b[i]]+=a[i];
}
for(int i=1;i<=tot;i++)
{
l[i]=(i-1)*len+1;
r[i]=i*len;
//sort(cop+l[i]+1,cop+r[i]+1);
if(i==tot) r[i]=n;
}
for(int i=1;i<=tot;i++)
{
sort(cop+l[i],cop+r[i]+1);
}
for(int j=1;j<=m;j++)
{
char s[2];
int x,y,z;
scanf("%s",s);
if(s[0]=='M')
{
scanf("%d%d%d",&x,&y,&z);
if(b[x]==b[y])
{
for(int i=x;i<=y;i++)
{
a[i]+=z;
}
worki(x);
continue;
}
for(int i=x;i<=r[b[x]];i++)
{
a[i]+=z;
//sum[b[i]]+=z;
//sort(cop+x+1,cop+min(y,r[b[x]]));
}
for(int i=y;i>=l[b[y]];i--)
{
a[i]+=z;
//sum[b[i]]+=z;
//sort(cop+max(x,l[b[y]])+1,cop+y+1);
}
worki(x);worki(y);
for(int i=b[x]+1;i<=b[y]-1;i++)
{
add[i]+=z;
}
}
else
{
scanf("%d%d%d",&x,&y,&z);
ans=0;
if(b[x]==b[y])
{
for(int i=x;i<=y;i++)
{
if(a[i]+add[b[i]]>=z) ans++;
}
printf("%d\n",ans);
continue;
}
for(int i=x;i<=r[b[x]];i++)
{
if(a[i]+add[b[i]]>=z) ans++;
}
for(int i=y;j>=l[b[y]];i--)
{
if(a[i]+add[b[i]]>=z) ans++;
}
//work(x,min(y,r[b[x]]),z);
//work(max(x,l[b[y]]),y,z);
for(int i=b[x]+1;i<=b[y]-1;i++)
{
int d=lower_bound(a+l[i],a+r[i]+1,z-add[i])-a;
ans+=r[i]-d+1;
//work(l[i],r[i],z);
}
printf("%d\n",ans);
}
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000000;
struct node
{
int l,r,id;
}qu[maxn];
int n,q,a[maxn];
int len,tot,b[maxn];
int cnt[maxn],ll=1,rr=0,now=0;
bool cmp(node x,node y)
{
if(b[x.l]==b[y.l]) return x.r<y.r;
else return x.l<y.l;
}
/*int cmp(node x,node y) {
return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r);
}*/
void add(int pos)
{
if(!cnt[a[pos]]) ++now;
++cnt[a[pos]];
}
void del(int pos)
{
--cnt[a[pos]];
if(!cnt[a[pos]]) now--;
}
int ans[maxn];
int main()
{
scanf("%d",&n);
len=sqrt(n);
tot=n/len;
if(n%len) tot++;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=(i-1)/len+1;
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&qu[i].l,&qu[i].r);
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200000;
int n,m;
int a[maxn],l[maxn],r[maxn],b[maxn],sum[maxn];
int len,tot,add[maxn];
int main()
{
scanf("%d%d",&n,&m);
len=sqrt(n);//区间长度
tot=n/len;//区间个数
if(n%len) tot++;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=(i-1)/len+1;//隶属哪一块
sum[b[i]]+=a[i];//区间总和
}
for(int i=1;i<=tot;i++)
{
l[i]=(i-1)*len+1;//区间左右端点
r[i]=i*len;
}
for(int i=1;i<=m;i++)
{
int q,x,y,k;
scanf("%d",&q);
if(q==1)
{
scanf("%d%d%d",&x,&y,&k);
for(int j=x;j<=min(y,r[b[x]]);j++)
{
a[j]+=k;
sum[b[j]]+=k;
}
for(int j=y;j>=max(x,l[b[y]]);j--)
{
a[j]+=k;
sum[b[j]]+=k;
}
for(int j=b[x]+1;j<=b[y]-1;j++)
{
add[j]+=k;
}
}
else if(q==2)
{
long long ans=0;
scanf("%d%d",&x,&y);
for(int j=x;j<=min(y,r[b[x]]);j++)
{
ans+=a[j]+add[b[j]];
}
for(int j=y;j>=max(x,l[b[y]]);j--)
{
ans+=a[j]+add[b[j]];
}
for(int j=b[x]+1;j<=b[y]-1;j++)
{
ans+=sum[j]+add[j]*(r[j]-l[j]+1);
}
if(b[x]==b[y])
{
ans-=a[x]+a[y]+add[b[x]]+add[b[y]];
}
printf("%lld\n",ans);
}
}
return 0;
}
qu[i].id=i;
}
sort(qu+1,qu+q+1,cmp);
for(int i=1;i<=q;i++)
{
int ql=qu[i].l;
int qr=qu[i].r;
while(ll<ql) del(ll++);
while(ll>ql) add(--ll);
while(rr>qr) del(rr--);
while(rr<qr) add(++rr);
ans[qu[i].id]=now;
}
for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}