原本的代码RE了,现在照着标程改结果T了,改了4h多了qwq
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct _odt{
int l,r;
mutable int v;
_odt(int il,int ir=0,int iv=0):l(il),r(ir),v(iv){}
bool operator<(const _odt &x) const{ return l<x.l;}
};
set<_odt> st;
const int MAXN=10000000;
int n,m,cnt,p[MAXN+100];
bool vis[MAXN+100];
set<_odt>::iterator split(int x){
set<_odt>::iterator it=st.lower_bound(_odt(x));
if(it!=st.end()&&it->l==x) return it; --it;
if (it->r<x) return st.end();
int l=it->l,r=it->r,v=it->v;
st.erase(it);
st.insert(_odt(l,x-1,v));
return st.insert(_odt(x,r,v)).first;
}
void add(int l,int r,int val){
set<_odt>::iterator itr=split(r+1),itl=split(l);
st.erase(itl,itr);
st.insert(_odt(l,r,val));
}
void init(){
vis[0]=vis[1]=1;
for(int i=2;i<=MAXN;i++){
if(!vis[i]) p[cnt++]=i;
for(int j=0;p[j]*i<=MAXN;j++){
vis[p[j]*i]=true;
if(i%p[j]==0) break;
}
}
}
signed main(){
init();
scanf("%lld%lld",&n,&m);
for(int i=1,x;i<=n;i++){
scanf("%lld",&x);
st.insert(_odt(i,i,x));
}
while(m--){
int x,y,z; char ch[3];
scanf("%s%lld%lld",ch,&x,&y);
if(ch[0]=='A') swap(x,y),split(x+1),split(x)->v+=y;
else{
if(ch[0]=='R'){
scanf("%lld",&z);
add(y,z,x);
} else {
set<_odt>::iterator itl=split(x),itr=split(y+1);
int ans=0;
for(;itl!=itr;++itl) if((itl->v)<=10000000&&!vis[itl->v]) ans+=((itl->r)-(itl->l)+1);
printf("%lld\n",ans);
}
}
// set<_odt>::iterator itr=split(n+1),itl=split(1);
// for(;itl!=itr;itl++)
// {
// printf("%d %d:%d\n",itl->l,itl->r,itl->v);
// }
}
return 0;
}
原本以为是namespace封装常数大,但改了还是TLE