Submission #558861

#TimeUsernameProblemLanguageResultExecution timeMemory
558861OlympiaBrunhilda’s Birthday (BOI13_brunhilda)C++17
17.78 / 100
1102 ms135252 KiB
#include <bits/stdc++.h> using namespace std; template<class T> class SegmentTree { public: SegmentTree (int N) { N = (1 << ((int)floor(log2(N - 1)) + 1)); this->N = N; val.assign(2 * N, ID); } void update (int x, T y) { x += N - 1; val[x] = y; while (x != 0) { x = (x - 1)/2; val[x] = merge(val[2 * x + 1], val[2 * x + 2]); } } T query (int ind, const int l, const int r, int tl, int tr) { if (tl >= l && tr <= r) { return val[ind]; } if (tr < l || tl > r) { return ID; } return merge(query(2 * ind + 1, l, r, tl, (tl + tr)/2), query(2 * ind + 2, l, r, (tl + tr)/2 + 1, tr)); } T query (int l, int r) { return query(0, l, r, 0, N - 1); } private: vector<T> val; T ID = 1e9; T merge (T x, T y) { return min(x, y); } int N; }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int M, Q; cin >> M >> Q; vector<int> p(M); SegmentTree<int> st(M); map<int,int> primes; for (int i = 0; i < M; i++) { cin >> p[i]; st.update(i, 0); } sort(p.begin(), p.end()); for (int i = 0; i < M; i++) { primes[p[i]] = i; st.update(i, 0); } int mx = 1000000; int res[mx]; bool isPrime[mx]; for (int i = 0; i < mx; i++) { isPrime[i] = true; } isPrime[0] = isPrime[1] = false; vector<int> fact[mx]; for (int i = 2; i < mx; i++) { if (isPrime[i]) { for (int j = 2 * i; j < mx; j += i) { isPrime[j] = false; fact[j].push_back(i); } fact[i].push_back(i); } } for (int i = 1; i < mx; i++) { int ans = 1e9; vector<int> invalid; invalid.push_back(-1); for (int j: fact[i]) { if (primes.count(j)) invalid.push_back(primes[j]); } invalid.push_back(p.size()); for (int j = 0; j < (int)invalid.size() - 1; j++) { if (invalid[j] + 1 <= invalid[j + 1] - 1) { ans = min(ans, st.query(invalid[j] + 1, invalid[j + 1] - 1) + 1); } } for (int j: invalid) { if (j >= 0 && j < (int)p.size()) { st.update(j, ans); } } res[i] = ans; } while (Q--) { int x; cin >> x; if (res[x] == (int)1e9) { cout << "oo\n"; } else { cout << res[x] << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...