线段树求调
查看原帖
线段树求调
1061320
Isharmla楼主2023/8/30 09:21
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=a;i<=b;i++)
const int N = 1e6 + 5, TN = 1e7;

inline int read();

int n, Q, a[N], Tree[N], Tree_P[N], v, l, r, lazy[N];

bitset <1> P[TN + 5];

inline void Solve() {
	P[1][0] = 0;
	F(i, 2, TN) {
		if (P[i][0]) continue;
		for (int j = i + i; j <= TN; j += i) P[j] |= 1;
	}
	return;
}

inline void Merge(int num) {
	Tree[num] = Tree[num << 1] + Tree[num << 1 | 1];
	Tree_P[num] = Tree_P[num << 1] + Tree_P[num << 1 | 1];
	return;
}

inline void Push_down(int num, int l, int r) {
	if (!lazy[num]) return;
	int mid = (l + r) >> 1;
	lazy[num << 1] = lazy[num << 1 | 1] = lazy[num];
	Tree[num << 1] = (mid - l + 1) * lazy[num];
	Tree[num << 1 | 1] = (r - mid) * lazy[num];
	Tree_P[num << 1] = Tree_P[num << 1 | 1] = 0;
	if (lazy[num] <= TN) {
		if (!P[lazy[num]][0]) {
			Tree_P[num << 1] = (mid - l + 1);
			Tree_P[num << 1 | 1] = (r - mid);
		}
	}
	lazy[num] = 0;
	return;
}

inline void Build(int num, int l, int r) {
	if (l == r) {
		Tree[num] = a[l];
		if (a[l] <= TN) {
			if (!P[a[l]][0]) Tree_P[num] = 1;
		}
		return;
	}
	int mid = (l + r) >> 1;
	Build(num << 1, l, mid);
	Build(num << 1 | 1, mid + 1, r);
	Merge(num);
}

char opt;

inline void Modify(int num, int l, int r, int l1, int r1, int val) {
	if (l > r1 || r < l1) return;
	if (l == r && l == l1) {
		Tree[num] += val;
		Tree_P[num] = 0;
		if (Tree[num] <= TN) {
			if (!P[Tree[num]][0]) Tree_P[num] = 1;
		}
		return;
	}
	int mid = (l + r) >> 1;
	Modify(num << 1, l, mid, l1, r1, val);
	Modify(num << 1 | 1, mid + 1, r, l1, r1, val);
	Merge(num);
}

inline int Query(int num, int l, int r, int l1, int r1) {
	Push_down(num, l, r);
	if (l > r1 || r < l1) return 0;
	if (l1 <= l && r <= r1) return Tree_P[num];
	int mid = (l + r) >> 1;
	return Query(num << 1, l, mid, l1, r1) + Query(num << 1 | 1, mid + 1, r, l1, r1);
}

inline void Modify1(int num, int l, int r, int l1, int r1, int val) {
	if (l > r1 || r < l1) return;
	if (l1 <= l && r <= r1) {
		Tree[num] = (r - l + 1) * val;
		Tree_P[num] = 0;
		lazy[num] = val;
		if (val <= TN) {
			if (!P[val][0]) Tree_P[num] = r - l + 1;
		}
		return;
	}
	int mid = (l + r) >> 1;
	Push_down(num,l,r);
	Modify1(num << 1, l, mid, l1, r1, val);
	Modify1(num << 1 | 1, mid + 1, r, l1, r1, val);
	Push_down(num, l, r);
	Merge(num);
}

signed main() {
	n = read(), Q = read();
	F(i, 1, n) a[i] = read();
	Solve();
	Build(1, 1, n);
	while (Q--) {
		cin >> opt;
		if (opt == 'A') {
			v = read(), l = read();
			Modify(1, 1, n, l, l, v);
		}
		if (opt == 'Q') {
			l = read(), r = read();
			cout << Query(1, 1, n, l, r) << endl;
		}
		if (opt == 'R') {
			v = read(), l = read(), r = read();
			Modify1(1, 1, n, l, r, v);
		}
	}
	return 0;
}

inline int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') f *= -1;
		c = getchar();
	}
	while (c <= '9' && c >= '0') {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}


2023/8/30 09:21
加载中...