답안 #852955

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
852955 2023-09-23T09:07:59 Z serifefedartar Radio (COCI22_radio) C++17
0 / 110
411 ms 86972 KB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll LOGN = 20;
const ll MAXN = 1e6 + 5;


int n, q;
set<int> prm[MAXN];
int divs[MAXN], on[MAXN]; 
int sg[4*MAXN], ans[MAXN];
void init(int k, int a, int b) {
	if (a == b) {
		sg[k] = 1e9;
		return ;
	}
	init(2*k, a, (a+b)/2);
	init(2*k+1, (a+b)/2+1, b);
	sg[k] = min(sg[2*k], sg[2*k+1]);
}

void update(int k, int a, int b, int plc, int x) {
	if (b < plc || a > plc)
		return ;
	if (a == b) {
		sg[k] = x;
		return ;
	}
	update(2*k, a, (a+b)/2, plc, x);
	update(2*k+1, (a+b)/2+1, b, plc, x);
	sg[k] = min(sg[2*k], sg[2*k+1]);
}

int query(int k, int a, int b, int q_l, int q_r) {
	if (q_r < a || q_l > b)
		return 1e9;
	if (q_l <= a && b <= q_r)
		return sg[k];
	return min(query(2*k, a, (a+b)/2, q_l, q_r), query(2*k+1, (a+b)/2+1, b, q_l, q_r));
}

void activate(int x) {
	int tmp_x = x;
	while (tmp_x > 1) {
		int p = divs[tmp_x];
		prm[p].insert(x);

		auto it = prm[p].lower_bound(x);
		if (it != prm[p].begin()) {
			it--;
			if (ans[*it] > x) {
				update(1, 1, n, *it, x);	
				ans[*it] = x;
			}
		}

		it = prm[p].upper_bound(x);
		if (it != prm[p].end()) {
			if (ans[x] > ans[*it]) {
				update(1, 1, n, x, ans[*it]);
				ans[x] = ans[*it]; 
			}
		}

		while (tmp_x % p == 0)
			tmp_x /= p;
	}
	on[x] = true;
}

void deactivate(int x) {
	vector<int> temp;
	int tmp_x = x;
	while (tmp_x > 1) {
		int p = divs[tmp_x];

		auto it = prm[p].lower_bound(x);
		if (it != prm[p].begin()) {
			it--;
			if (ans[*it] == x)
				temp.push_back(*it);
		}

		while (tmp_x % p == 0)
			tmp_x /= p;
		prm[p].erase(x);
	}
	ans[x] = 1e9;

	sort(temp.begin(), temp.end());
	temp.erase(unique(temp.begin(), temp.end()), temp.end());
	for (auto u : temp)
		activate(u);
	on[x] = false;
}

int main() {
	fast
	cin >> n >> q;

	divs[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (divs[i] == 0) {
			for (int j = i; j <= n; j += i)
				divs[j] = i;
		}
	}
	init(1, 1, n);

	for (int i = 1; i <= n; i++)
		ans[i] = 1e9;

	while (q--) {
		char ch;
		cin >> ch;
		if (ch == 'S') {
			int x;
			cin >> x;
			if (x != 1 && on[x])
				deactivate(x);
			else if (x != 1)
				activate(x);
		} else {
			int l, r;
			cin >> l >> r;
			int q = query(1, 1, n, l, r);
			if (q <= r)
				cout << "DA\n";
			else
				cout << "NE\n";
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 52056 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 225 ms 63312 KB Output is correct
2 Correct 374 ms 78264 KB Output is correct
3 Correct 411 ms 86972 KB Output is correct
4 Incorrect 14 ms 56920 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 52056 KB Output isn't correct
2 Halted 0 ms 0 KB -