WA 求调
查看原帖
WA 求调
857323
linxuanrui楼主2024/1/21 21:48
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
typedef long long ll;
using namespace std;
const int N = 1e6 + 5;
int n,q,a[N],t[N << 4],len,x,v,l,r;
bool prime[N << 4];
char opt;
void init(){
	memset(prime,true,sizeof(prime));
	prime[0] = prime[1] = false;
	for(int i = 2;i <= 10000000;i++){
		if(prime[i])t[++len] = i;
		for(int j = 1;j <= len && t[j] * i <= 10000000;j++){
			prime[i * t[j]] = false;
			if(i % t[j] == 0)break;
		}
	}
}
struct node{int l,r,cnt,change;}tree[N << 2];
void pushup(int p){tree[p].cnt = tree[p * 2].cnt + tree[p * 2 + 1].cnt;}
void pushdown(int p){
	if(!tree[p].change)return;
	tree[p * 2].change = tree[p].change;
	tree[p * 2 + 1].change = tree[p].change;
	tree[p * 2].cnt = (tree[p * 2].r - tree[p * 2].l + 1) * (tree[p].change <= 10000000 && prime[tree[p].change]);
	tree[p * 2 + 1].cnt = (tree[p * 2 + 1].r - tree[p * 2 + 1].l + 1) * (tree[p].change <= 10000000 && prime[tree[p].change]);
	tree[p].change = 0;
}
void build(int p,int l,int r){
	tree[p].l = l,tree[p].r = r;
	if(l == r){
		tree[p].cnt = (a[l] <= 10000000 && prime[a[l]]);
		tree[p].change = 0;
		return;
	}
	int mid = (l + r) / 2;
	build(p * 2,l,mid);
	build(p * 2 + 1,mid + 1,r);
	pushup(p);
}
void add(int p,int x,int v){
	if(x < tree[p].l || tree[p].r < x)return;
	if(tree[p].l == tree[p].r)return a[l] += x,tree[p].cnt = (a[l] <= 10000000 && prime[a[l]]),void();
	pushdown(p);
	add(p * 2,x,v),add(p * 2 + 1,x,v);
	pushup(p);
}
void change(int p,int l,int r,int x){
	if(r < tree[p].l || tree[p].r < l)return;
	if(l <= tree[p].l && tree[p].r <= r){
		tree[p].cnt = (x <= 10000000 && prime[x]) * (tree[p].r - tree[p].l + 1);
		tree[p].change = x;
		return;
	}
	pushdown(p);
	change(p * 2,l,r,x);
	change(p * 2 + 1,l,r,x);
	pushup(p);
}
int query(int p,int l,int r){
	if(r < tree[p].l || tree[p].r < l)return 0;
	if(l <= tree[p].l && tree[p].r <= r)return tree[p].cnt;
	pushdown(p);
	return query(p * 2,l,r) + query(p * 2 + 1,l,r);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> q;
	for(int i = 1;i <= n;i++)cin >> a[i];
	init();
	build(1,1,n);
	while(q--){
		cin >> opt;
		if(opt == 'A')cin >> v >> x,add(1,x,v);
		else if(opt == 'R')cin >> x >> l >> r,change(1,l,r,x);
		else if(opt == 'Q')cin >> l >> r,cout << query(1,l,r) << endl;
	}
}

2024/1/21 21:48
加载中...