Submission #746759

#TimeUsernameProblemLanguageResultExecution timeMemory
746759OlympiaRadio (COCI22_radio)C++17
0 / 110
1562 ms14768 KiB
#include <vector> #include <iostream> #include <cassert> #include <cmath> #include <map> #include <set> using namespace std; struct BIT{ vector<long long> bit; //1-indexed long long pref(long long ind){ long long ans = 0; ind++; while(ind > 0){ //cout << ind << " "; ans += bit[ind]; ind -= (ind & (-ind)); } return ans; } long long sum(long long l, long long r){ if(l == 0){ return pref(r); } return pref(r) - pref(l - 1); } void update(long long ind, long long val){ ind++; while(ind < bit.size()){ bit[ind] += val; ind += ind & (-ind); } } void construct(int n){ bit.resize(n + 1); for(int i = 0; i <= n; i++){ bit[i] = 0; } } }; struct SegmentTreeMin { vector<int> vec; const int id = (int)1e9; int merge (int x, int y) { return min(x, y); } void update (int x, int y) { x += (int)vec.size()/2 - 1; vec[x] = y; while (x != 0) { x = (x - 1)/2; vec[x] = merge(vec[2 * x + 1], vec[2 * x + 2]); } } int query (int dum, int tl, int tr, int l, int r) { if (tl >= l and tr <= r) { return vec[dum]; } if (tl > r or tr < l) { return id; } return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r)); } int query (int l, int r) { return query(0, 0, (int)vec.size()/2 - 1, l, r); } SegmentTreeMin (int n) { n = (1 << ((int)log2(n) + 1)); vec.assign(2 * n, id); } }; int main () { //freopen("grass.out", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(NULL); int N, Q; cin >> N >> Q; vector<vector<int>> queries; vector<bool> ans; ans.assign(Q, false); vector<int> factors(N + 1); vector<bool> isPrime(N + 1); isPrime.assign(N + 1, true); factors[1] = 1; for (int i = 2; i <= N; i++) { if (not isPrime[i]) { continue; } for (int j = i; j <= N; j += i) { factors[j] = i; isPrime[j] = false; } } while (Q--) { char c; cin >> c; if (c == 'C') { int x, y; cin >> x >> y; queries.push_back({--x, --y}); } else { int x; cin >> x; queries.push_back({--x}); } } bool act[N]; for (int i = 2; i * i <= N; i++) { //cout << i << '\n'; for (int j = 0; j < N; j++) { act[j] = false; } set<int> s; for (int j = 0; j < queries.size(); j++) { auto q = queries[j]; if (q.size() == 1) { if ((q[0] + 1) % i == 0) { if (!act[q[0]]) { s.insert((q[0] + 1)/i); } else { s.erase((q[0] + 1)/i); } act[q[0]] = not act[q[0]]; } } else { auto it = s.lower_bound(q[0]/i); if (it == s.end()) { continue; } ++it; if (it == s.end() or (*it) > q[1]/i) { continue; } ans[j] = true; } } } SegmentTreeMin next_oc(N + 1); set<int> oc[N]; for (int j = 0; j < N; j++) { act[j] = false; } for (int i = 0; i < queries.size(); i++) { auto q = queries[i]; if (q.size() == 1) { if ((q[0] + 1) * (q[0] + 1) < N) { continue; } int x = q[0]; if (act[x]) { oc[factors[x + 1]].erase(q[0]); next_oc.update(x, next_oc.id); auto it = oc[factors[x + 1]].lower_bound(q[0]); if (it != oc[factors[x + 1]].begin()) { --it; next_oc.update(*it, next_oc.id); } } else { oc[factors[x + 1]].insert(q[0]); auto it = oc[factors[x + 1]].upper_bound(q[0]); if (it != oc[factors[x + 1]].end()) { next_oc.update(x, *it); } it = oc[factors[x + 1]].lower_bound(q[0]); if (it != oc[factors[x + 1]].begin()) { --it; next_oc.update(*it, x); } } act[q[0]] = not act[q[0]]; } else { int l = q[0], r = q[1]; int res = next_oc.query(l, r); if (res <= r) { ans[i] = 1; } } } for (int i = 0; i < queries.size(); i++) { if (queries[i].size() == 2) { cout << (ans[i] ? "DA" : "NE") << '\n'; } } }

Compilation message (stderr)

Main.cpp: In member function 'void BIT::update(long long int, long long int)':
Main.cpp:28:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |         while(ind < bit.size()){
      |               ~~~~^~~~~~~~~~~~
Main.cpp: In function 'int main()':
Main.cpp:113:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |         for (int j = 0; j < queries.size(); j++) {
      |                         ~~^~~~~~~~~~~~~~~~
Main.cpp:142:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
Main.cpp:178:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  178 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...