Submission #542537

#TimeUsernameProblemLanguageResultExecution timeMemory
542537Zhora_004Radio (COCI22_radio)C++17
40 / 110
1192 ms144952 KiB
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <unordered_set> #include <queue> #include <deque> #include <string> #include <sstream> #include <iomanip> #include <map> #include <unordered_map> #include <stack> #include <cstdio> #include <climits> #include <tuple> #include <ctime> #include <cstring> #include <numeric> #include <functional> #include <chrono> #include <cassert> #include <bitset> //#include <bit> //#include <ranges> //#include <numbers> #define itn int #define sacnf scanf #define sz(a) ((int)((a).size())) // printf("%.10f\n", ans); using ll = long long; using namespace std; const ll mod = 1e9 + 7; const int N = 1e6 + 1, inf = 1e9; void modify(vector<int>& segtree, int id, int v, int u, int tl, int tr) { if (tl == tr) segtree[u] = v; else { int tm = (tl + tr) >> 1; if (id <= tm) modify(segtree, id, v, u * 2 + 1, tl, tm); else modify(segtree, id, v, u * 2 + 2, tm + 1, tr); segtree[u] = min(segtree[u * 2 + 1], segtree[u * 2 + 2]); } } void modify1(vector<int>& segtree, int id, int v, int u, int tl, int tr) { if (tl == tr) segtree[u] = v; else { int tm = (tl + tr) >> 1; if (id <= tm) modify1(segtree, id, v, u * 2 + 1, tl, tm); else modify1(segtree, id, v, u * 2 + 2, tm + 1, tr); segtree[u] = max(segtree[u * 2 + 1], segtree[u * 2 + 2]); } } int find_val(vector<int>& segtree, int& l, int& r, int u, int tl, int tr) { if (tl > r || tr < l) return inf; if (l <= tl && tr <= r) return segtree[u]; int tm = (tl + tr) >> 1; return min(find_val(segtree, l, r, u * 2 + 1, tl, tm), find_val(segtree, l, r, u * 2 + 2, tm + 1, tr)); } int find_val1(vector<int>& segtree, int& l, int& r, int u, int tl, int tr) { if (tl > r || tr < l) return -1; if (l <= tl && tr <= r) return segtree[u]; int tm = (tl + tr) >> 1; return max(find_val1(segtree, l, r, u * 2 + 1, tl, tm), find_val1(segtree, l, r, u * 2 + 2, tm + 1, tr)); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<set<int>> id(n + 1); vector<vector<int>> divs(n + 1); for (int i = 2; i <= n; i++) if (divs[i].empty()) for (int j = i; j <= n; j += i) divs[j].push_back(i); vector<int> L(n + 1, -1), R(n + 1, inf); vector<bool> on(n + 1); int len = 1; while (len <= n) len <<= 1; vector<int> segtree(len << 1, inf); vector<int> segtree1(len << 1, -1); while (q--) { char smb; cin >> smb; if (smb == 'S') { int x; cin >> x; if (on[x]) { for (int& d : divs[x]) { set<int>& s = id[d]; s.erase(x); auto it = s.upper_bound(x); int l = -1, r = inf; if (it != s.end()) r = *it; if (it != s.begin()) l = *prev(it); if (it != s.end()) { int id1 = *it; if (L[id1] == x) L[id1] = -1; L[id1] = max(L[id1], l); modify1(segtree1, id1, L[id1], 0, 0, len - 1); } if (it != s.begin()) { it--; int id1 = *it; if (R[id1] == x) R[id1] = inf; R[id1] = min(R[id1], r); modify(segtree, id1, R[id1], 0, 0, len - 1); } } L[x] = -1; R[x] = inf; modify(segtree1, x, L[x], 0, 0, len - 1); modify(segtree, x, R[x], 0, 0, len - 1); } else { for (int& d : divs[x]) { set<int>& s = id[d]; auto it = s.upper_bound(x); if (it == s.end()) R[x] = min(R[x], inf); else { R[x] = min(R[x], *it); L[*it] = max(L[*it], x); modify1(segtree1, *it, L[*it], 0, 0, len - 1); } modify(segtree, x, R[x], 0, 0, len - 1); if (it == s.begin()) L[x] = max(L[x], -1); else { it--; L[x] = max(L[x], *it); R[*it] = min(R[*it], x); modify(segtree, *it, R[*it], 0, 0, len - 1); } modify1(segtree1, x, L[x], 0, 0, len - 1); s.insert(x); } } on[x] = !on[x]; } else { int l, r; cin >> l >> r; int mn = find_val(segtree, l, r, 0, 0, len - 1); int mx = find_val1(segtree1, l, r, 0, 0, len - 1); if (mn <= r || mx >= l) cout << "DA\n"; else cout << "NE\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...