#include<bits/stdc++.h>
using namespace std;
//极致暴力珂朵莉!!!
//inline int read(){
// int s=0,w=1;
// char ch=getchar();
// while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
// while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
// return s*w;
//}//通用快写
//inline void write(register long long x)
//{
// if(x<0)
// {
// putchar('-');
// x=-x;
// }
// if(x>9) write(x / 10);
// putchar(x % 10 + '0');
//}//通用快读
long long primes[1000100];
bool f[1000100];
typedef long long LO;
struct Tree
{
int l,r;//用的区间
mutable LO value;//修改返回的迭代器
//重;载
Tree(int L,int R=-1,LO V=0):l(L),r(R),value(V){}
bool operator<(const Tree&z) const
{
return l<z.l;
}
};
set<Tree> s;
set<Tree>::iterator fl(register int p)//拆分区间使连续段分裂完整
{
set<Tree>::iterator it=s.lower_bound(Tree(p));
if(it!=s.end() && it->l==p) return it;//已经完整不用拆
it--;
register int l=it->l,r=it->r;
LO val=it->value;
s.erase(it);
s.insert(Tree(l,p-1,val));//删除原连续段然后插入新连续段
return s.insert(Tree(p,r,val)).first;//返回迭代器
}
inline void hb(register int l,register int r,LO t)//平推/平摊区间 使成为大区间
{
set<Tree>::iterator q=fl(r+1);
set<Tree>::iterator p=fl(l);
s.erase(p,q);
s.insert(Tree{l,r,t});
}
void sss()
{
register int i,j;
for(i=4;i<=1e7;i+=2) f[i]=true,sum++;
for(i=3;i<=sqrt(1e7);++i)
{
if(!f[i])
{
for(j=i;i*j<=1e7;++j)
{
if(!f[i*j])
{
f[i*j]=true;
}
}
}
}
}
int main()
{
sss();
register LO n,m,i,res,l,r,x;
char a;
scanf("%lld%lld",&n,&m);
for (i=1;i<=n;++i)
{
scanf("%lld",&x);
s.insert(Tree(i,i,x));
}
while(m--)
{
char p[3];
scanf("%s",p);
if(p[0]=='A')
{
scanf("%lld%lld",&x,&l);
fl(l + 1),fl(l)->value+=x;
}
else if(p[0]=='R')
{
scanf("%lld%lld%lld",&x,&l,&r);
hb(l,r,x);
}
else if(p[0]=='Q')
{
scanf("%lld%lld",&l,&r);
set<Tree>::iterator itr=fl(r+1),itl=fl(l);
res=0;
for (set<Tree>::iterator i=itl;i!=itr;i++)
if (i->value<=1e7 && !f[i->value])
res+=(i->r)-(i->l)+1;
printf("%lld\n",res);
}
}
return 0;
}
一直unknown error
qwq