RE求助
查看原帖
RE求助
285617
黑影洞人楼主2022/9/11 19:03
#include<cstdio>
#include<algorithm>
#include<set>
#include<bitset>
#define N 10000007
#define int long long
#define ct Chtholly_tree
#define Chtholly set<ct>::iterator
using namespace std;
bitset<N>isp;
int n,m;
void csh(){
	isp.set();
	isp[1]=0;
	for(int i=2;i<=10000000;i++){
		if(!isp[i])continue;
		for(int j=2*i;j<=10000000;j+=i)isp[j]=0;
	}
}
struct Chtholly_tree{
	int l,r;
	mutable int val;
	ct(int a=0,int b=0,int c=0){l=a,r=b,val=c;}
	bool operator<(const ct &c)const{return l<c.l;}	
};
set<ct>st;
Chtholly split(int p){
	Chtholly it=st.lower_bound(ct(p,0,0));
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int v){
	Chtholly right=split(r+1),left=split(l);
	st.erase(left,right);
	st.insert(ct(l,r,v));
}
void change(int x,int v){
	Chtholly r=split(x+1),l=split(x);
	l->val+=v;
}
int query(int l,int r){
	int res=0;
	Chtholly right=split(r+1),left=split(l);
	for(;left!=right;left++){
		if(isp[left->val])res+=(left->r-left->l+1);
	}
	return res;
}
signed main(){
	csh();
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		int a;
		scanf("%lld",&a);
		st.insert(ct(i,i,a));
	}
	while(m--){
		char s[12];
		int l,r,v;
		scanf("%s%lld%lld",s,&l,&r);
		if(s[0]=='A'){
			change(r,l);
		}else if(s[0]=='R'){
			scanf("%lld",&v);
			assign(r,v,l);
		}else printf("%lld\n",query(l,r));
	}
	return 0;
}



2022/9/11 19:03
加载中...