Submission #566728

#TimeUsernameProblemLanguageResultExecution timeMemory
566728dxz05Radio (COCI22_radio)C++14
110 / 110
1153 ms441560 KiB
#include <bits/stdc++.h> using namespace std; const int N = 4e6 + 3e2; set<int> positions[N]; int divp[N]; multiset<int> bad_segments[N]; int t[N]; int value[N]; void update(int v, int tl, int tr, int pos, int val){ if (tl == tr){ t[v] = val; return; } int tm = (tl + tr) >> 1; if (pos <= tm) update(v << 1, tl, tm, pos, val); else update(v << 1 | 1, tm + 1, tr, pos, val); t[v] = min(t[v << 1], t[v << 1 | 1]); } int get(int v, int tl, int tr, int l, int r){ if (l <= tl && tr <= r) return t[v]; if (tl > r || tr < l) return 1e9; int tm = (tl + tr) >> 1; return min(get(v << 1, tl, tm, l, r), get(v << 1 | 1, tm + 1, tr, l, r)); } void add_segment(int l, int r){ bad_segments[l].insert(r); } void del_segment(int l, int r){ bad_segments[l].erase(bad_segments[l].find(r)); } int n; void update(int i){ if (i == -1) return; int cur = 1e9; if (!bad_segments[i].empty()) cur = *bad_segments[i].begin(); if (cur != value[i]) update(1, 1, n, i, cur); value[i] = cur; } void add_element(int p, int i){ positions[p].insert(i); auto it = positions[p].find(i); int l = -1, r = -1; if (it != positions[p].begin()) l = *prev(it); if (next(it) != positions[p].end()) r = *next(it); if (l != -1) add_segment(l, i); if (r != -1) add_segment(i, r); if (l != -1 && r != -1) del_segment(l, r); update(i); update(l); } void del_element(int p, int i){ auto it = positions[p].find(i); int l = -1, r = -1; if (it != positions[p].begin()) l = *prev(it); if (next(it) != positions[p].end()) r = *next(it); if (l != -1) del_segment(l, i); if (r != -1) del_segment(i, r); if (l != -1 && r != -1) add_segment(l, r); positions[p].erase(i); update(i); update(l); } bool used[N]; int main() { ios_base::sync_with_stdio(false); int q; cin >> n >> q; iota(divp + 1, divp + n + 1, 1); for (int i = 2; i * i <= n; i++){ if (divp[i] != i) continue; for (int j = i * i; j <= n; j += i){ divp[j] = i; } } fill(t, t + N, 1e9); fill(value, value + n + 1, 1e9); while (q--){ char type; cin >> type; if (type == 'S'){ int x; cin >> x; int i = x; while (x != 1){ int p = divp[x]; if (!used[i]) add_element(p, i); else del_element(p, i); while (x % p == 0) x /= p; } used[i] ^= 1; } else { int l, r; cin >> l >> r; bool ok = get(1, 1, n, l, r) <= r; cout << (ok ? "DA\n" : "NE\n"); } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...