#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <string>
using namespace std;
#define LL long long
#define lt x<<1
#define rt x<<1|1
const int maxn = 110000+33;
int b[maxn];
int Minb[maxn<<2],Maxa[maxn<<2],cnt[maxn<<2];
int lazy[maxn<<2];
void up(int x,int l,int r)
{
Minb[x]=min(Minb[lt],Minb[rt]);
Maxa[x]=max(Maxa[lt],Maxa[rt]);
cnt[x]=cnt[lt]+cnt[rt];
}
void build(int x,int l,int r)
{
lazy[x]=0;
Maxa[x]=cnt[x]=0;
Minb[x]=b[l];
if(l==r){
return;
}
int mid=(l+r)>>1;
build(lt,l,mid);
build(rt,mid+1,r);
up(x,l,r);
}
void pushdown(int x,int l,int r)
{
if(lazy[x]){
Maxa[lt]+=lazy[x];
Maxa[rt]+=lazy[x];
lazy[rt]+=lazy[x];//
lazy[lt]+=lazy[x];//
lazy[x]=0;
}
}
void update(int x,int l,int r,int ll,int rr)
{
if(ll<=l&&rr>=r){
Maxa[x]++;
if(Maxa[x]<Minb[x]){
lazy[x]++;
return;
}
if(l==r){
cnt[x]++;
Minb[x]+=b[l];
return;
}
}
pushdown(x,l,r);
int mid = (l+r)>>1;
if(ll<=mid) update(lt,l,mid,ll,rr);
if(mid<rr) update(rt,mid+1,r,ll,rr);
up(x,l,r);
}
int query(int x,int l,int r,int ll,int rr)
{
int ans=0;
if(ll<=l&&rr>=r){
return cnt[x];
}
pushdown(x,l,r);
int mid = (l+r)>>1;
if(ll<=mid) ans+=query(lt,l,mid,ll,rr);
if(mid<rr) ans+=query(rt,mid+1,r,ll,rr);
up(x,l,r);
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
char s[20];
int l,r;
scanf("%s%d%d",s,&l,&r);
if(s[0]=='a'){
update(1,1,n,l,r);
}else{
int ans=query(1,1,n,l,r);
printf("%d\n",ans);
}
}
}
return 0;
}