RT 样例过了,提交 WA
#include<bits/stdc++.h>
using namespace std;
#define INF 0x7f7f7f7f
#define map unorded_map
#define re register
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define Mod 998244353
#define F1(i,a,b,k) for(re int i=a;i<=b;i+=k)
#define F2(i,a,b,k) for(re int i=a;i>=b;i-=k)
namespace Fast_Io{
template<typename T> inline void read(T &t){
t=0;
char c=getchar();
int f=1;
while(!isdigit(c)){
if(c=='-') f=-f;
c=getchar();
}
while(isdigit(c)){
t=(t<<3)+(t<<1)+(c^'0');
c=getchar();
}
t*=f;
}
template<typename T,typename ... Args> inline void read(T &t,Args&... args){
read(t);
read(args...);
}
template<typename T> inline void print(T x,char c='\0'){
if(x<0){
x=-x;
putchar('-');
}
if(x>9){
print(x/10);
}
putchar(x%10+'0');
if(c!='\0'){
putchar(c);
}
}
template<typename T> inline T abs(T x){return x<0?-x:x;}
inline int lowbit(int x){return x&(-x);}
}
using namespace Fast_Io;
const int N = 1e5+5;
int n,m,a[N],sz;
struct Tree{
int l,r,sum,lazy_tag;
}tr[N*4];
const int M = 1e7+5;
bool prime[M];
int loc[M];
inline void Prime(int n){
memset(prime,1,sizeof(prime));
prime[0]=prime[1]=0;
F1(i,2,n-1,1){
if(prime[i]) loc[++sz]=i;
for(int j=1;j<=sz && i*loc[j]<=n;j++){
prime[i*loc[j]]=0;
if(i%loc[j]==0) break;
}
}
}
inline void pushup(int p){tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;}
inline bool check(int p){return p<=(1e7)&&prime[p];}
inline void bulid(int p,int l,int r){
tr[p].l=l,tr[p].r=r;
if(l==r){
tr[p].lazy_tag=a[l];
tr[p].sum=check(a[l]);
return ;
}
int mid=l+r>>1;
bulid(p*2,l,mid);
bulid(p*2+1,mid+1,r);
pushup(p);
}
inline void pushdown(int p){
if(tr[p].lazy_tag){
int mid=tr[p].l+tr[p].r>>1;
tr[p*2].sum=(tr[p].sum>0)*(mid-tr[p].l+1);
tr[p*2+1].sum=(tr[p].sum>0)*(tr[p].r-mid);
tr[p*2].lazy_tag=tr[p].lazy_tag;
tr[p*2+1].lazy_tag=tr[p].lazy_tag;
tr[p].lazy_tag=0;
}
return ;
}
inline int query(int p,int ql,int qr){
if((ql<=tr[p].l && tr[p].r<=qr) || !tr[p].sum) return tr[p].sum;
pushdown(p);
int mid=tr[p].l+tr[p].r>>1,ans=0;
if(ql<=mid) ans+=query(p*2,ql,qr);
if(qr>mid) ans+=query(p*2+1,ql,qr);
return ans;
}
inline void update(int p,int id,int k){
if(tr[p].l==tr[p].r){
tr[p].lazy_tag+=k;
tr[p].sum=check(tr[p].lazy_tag);
return ;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(id<=mid) update(p*2,id,k);
else update(p*2+1,id,k);
pushup(p);
}
inline void update2(int p,int ul,int ur,int k){
if(ul<=tr[p].l && tr[p].r<=ur){
tr[p].sum=tr[p].r-tr[p].l+1*check(k);
tr[p].lazy_tag=k;
return ;
}
pushdown(p);
int mid=tr[p].l+tr[p].r>>1;
if(ul<=mid) update2(p*2,ul,ur,k);
if(ur>mid) update2(p*2+1,ul,ur,k);
pushup(p);
}
int main(){
Prime(M);
read(n,m);
F1(i,1,n,1) read(a[i]);
bulid(1,1,n);
while(m--){
int l,r,k;
char op;
cin>>op;
if(op=='A'){
read(k,l);
update(1,l,k);
}else if(op=='R'){
read(k,l,r);
update2(1,l,r,k);
}else{
read(l,r);
print(query(1,l,r),'\n');
}
}
return 0;
}