Submission #540843

#TimeUsernameProblemLanguageResultExecution timeMemory
540843N1NT3NDORadio (COCI22_radio)C++17
110 / 110
1331 ms198240 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> #define ll long long #define pb push_back #define sz(x) (int)x.size() #define fi first #define sd second #define all(x) x.begin(), x.end() //#pragma GCC target ("avx2") //#pragma GCC optimization ("O3") //#pragma GCC optimization ("unroll-loops") using namespace std; //using namespace __gnu_pbds; //typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; const int N = (int)1e6 + 3; int n, q, cnt, skok[N], t[4 * N]; bool was[N]; vector< int > del[N]; set < int > se[N]; multiset< int > all[N]; void build(int v, int tl, int tr) { t[v] = 1e9; if (tl == tr) return; int m = (tl + tr) >> 1; build(v * 2, tl, m); build(v * 2 + 1, m + 1, tr); } void upd(int v, int tl, int tr, int pos, int val) { if (tl == tr) { t[v] = val; return; } int m = (tl + tr) >> 1; if (pos <= m) upd(v * 2, tl, m, pos, val); else upd(v * 2 + 1, m + 1, tr, pos, val); t[v] = min(t[v * 2], t[v * 2 + 1]); } int get(int v, int tl, int tr, int l, int r) { if (tl > tr || tl > r || tr < l) return 1e9; if (tl >= l && tr <= r) return t[v]; int m = (tl + tr) >> 1; return min(get(v * 2, tl, m, l, r), get(v * 2 + 1, m + 1, tr, l, r)); } void upd(int x) { if (!x) return; int val = 1e9; if (sz(all[x]) > 0) val = *all[x].begin(); upd(1, 1, n, x, val); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q; for(int i = 2; i <= n; i++) { if (sz(del[i])) continue; for(int j = i; j <= n; j += i) del[j].emplace_back(i); } build(1, 1, n); while(q--) { char c; cin >> c; if (c == 'S') { int x; cin >> x; if (was[x]) { for(const auto &d : del[x]) { auto it = se[d].lower_bound(x); int r = 0, l = 0; if (next(it) != se[d].end()) r = *next(it); if (it != se[d].begin()) l = *prev(it); if (l) all[l].erase(all[l].find(x)); if (r) all[x].erase(all[x].find(r)); if (l && r) all[l].insert(r); upd(l); upd(x); se[d].erase(x); } } else { for(auto d : del[x]) { auto it = se[d].upper_bound(x); int r = 0, l = 0; if (it != se[d].end()) r = *it; if (it != se[d].begin()) l = *prev(it); if (l) all[l].insert(x); if (r) all[x].insert(r); if (l && r) all[l].erase(all[l].find(r)); upd(l); upd(x); se[d].insert(x); } } was[x] ^= 1; } else { int l, r; cin >> l >> r; if (get(1, 1, n, l, r) <= r) cout << "DA" << '\n'; else cout << "NE" << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...