Submission #51889578
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<long long> VL;
typedef vector<vector<long long>> VVL;
typedef pair<int, int> Pair;
typedef tuple<int, int, int> tpl;
#define ALL(a) (a).begin(), (a).end()
#define SORT(c) sort((c).begin(), (c).end())
#define REVERSE(c) reverse((c).begin(), (c).end())
#define LB(a, x) lower_bound((a).begin(), (a).end(), x) - (a).begin()
#define UB(a, x) upper_bound((a).begin(), (a).end(), x) - (a).begin()
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define RFOR(i, a, b) for (int i = (a) - 1; i >= (b); --i)
#define RREP(i, n) RFOR(i, n, 0)
#define en "\n"
constexpr double EPS = 1e-9;
constexpr double PI = 3.1415926535897932;
constexpr int INF = 2147483647;
constexpr long long LINF = 1LL << 60;
constexpr long long MOD = 998244353; // 1000000007;
template <class T>
inline bool chmax(T &a, T b) {
if (a < b) {
a = b;
return true;
}
return false;
}
template <class T>
inline bool chmin(T &a, T b) {
if (a > b) {
a = b;
return true;
}
return false;
}
template <class T>
struct Problem {
VI cnt;
vector<vector<Pair>> fact;
int sum;
Problem(vector<vector<Pair>> fact) : fact(fact) {
cnt.resize(1000100, 0);
sum = 0;
}
void add_id(int i) {
// process for adding index i
for (auto &[p, n] : fact[i]) {
sum -= cnt[p] % 3;
cnt[p] += n;
sum += cnt[p] % 3;
}
}
void erase_id(int i) {
// process for erasing index i
for (auto &[p, n] : fact[i]) {
sum -= cnt[p] % 3;
cnt[p] -= n;
sum += cnt[p] % 3;
}
}
T get_answer() {
// return current answer
return sum == 0;
}
};
struct Segment {
int L, R, query_id, block_id;
Segment(int L, int R, int query_id, int block_id) : L(L), R(R), query_id(query_id), block_id(block_id) {}
std::tuple<int, int, int> get_key() const {
if (block_id & 1) {
return std::make_tuple(block_id, -R, L);
}
return std::make_tuple(block_id, R, L);
}
};
bool operator<(const Segment &lhs, const Segment &rhs) {
return lhs.get_key() < rhs.get_key();
}
template <class T>
struct Mo {
int N, Q, sqrt_Q;
std::vector<int> L, R;
Mo(int N, int Q, std::vector<int> L, std::vector<int> R) : N(N), Q(Q), L(L), R(R) {
this->sqrt_Q = calc_sqrt(Q);
}
std::vector<Segment> get_sorted_segments() {
std::vector<Segment> segments;
for (int i = 0; i < Q; i++) {
segments.push_back(Segment(L[i], R[i], i, L[i] / sqrt_Q));
}
std::sort(segments.begin(), segments.end());
return segments;
}
std::vector<T> solve(Problem<T> p) {
int l = 0, r = 0;
std::vector<Segment> segments = get_sorted_segments();
std::vector<T> answers(Q);
for (Segment &segment : segments) {
int l_next = segment.L, r_next = segment.R;
if (r < r_next) {
for (int i = r; i < r_next; i++) {
p.add_id(i);
}
if (l < l_next) {
for (int i = l; i < l_next; i++) {
p.erase_id(i);
}
} else {
for (int i = l - 1; i >= l_next; i--) {
p.add_id(i);
}
}
} else {
if (l < l_next) {
for (int i = l; i < l_next; i++) {
p.erase_id(i);
}
} else {
for (int i = l - 1; i >= l_next; i--) {
p.add_id(i);
}
}
for (int i = r - 1; i >= r_next; i--) {
p.erase_id(i);
}
}
answers[segment.query_id] = p.get_answer();
l = l_next;
r = r_next;
}
return answers;
}
private:
int calc_sqrt(int x) {
int ng = 0, ok = sqrt(x) + 2;
while (ok - ng > 1) {
int m = (ok + ng) / 2;
if (m * m < x)
ng = m;
else
ok = m;
}
return ok;
}
};
struct SieveEratosthenes {
vector<int> min_fact;
SieveEratosthenes(int N) {
_build(N);
}
void _build(int N) {
min_fact.resize(N + 1);
for (int i = 0; i <= N; i++)
min_fact[i] = i;
min_fact[0] = min_fact[1] = -1;
for (int i = 2; i * i <= N; i++) {
for (int j = i * i; j <= N; j += i) {
if (i < min_fact[j])
min_fact[j] = i;
}
}
}
bool is_prime(int x) {
return min_fact[x] == x;
}
vector<pair<int, int>> factorize(int x) {
vector<pair<int, int>> ret;
while (x > 1) {
if (ret.empty() || ret.back().first != min_fact[x])
ret.emplace_back(min_fact[x], 1);
else
ret.back().second++;
x /= min_fact[x];
}
return ret;
}
};
void Main() {
int N, Q;
cin >> N >> Q;
VI A(N);
REP(i, N)
cin >> A[i];
SieveEratosthenes sieve(1000100);
vector<vector<Pair>> fact(N);
REP(i, N) {
fact[i] = sieve.factorize(A[i]);
}
VI L(Q), R(Q);
REP(i, Q)
cin >> L[i] >> R[i],
L[i]--;
Problem<int> p(fact);
Mo<int> mo(N, Q, L, R);
vector<int> ans = mo.solve(p);
REP(i, Q)
cout << (ans[i] ? "Yes" : "No") << en;
return;
}
int main(void) {
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cout << fixed << setprecision(15);
int t = 1; // cin>>t;
while (t--)
Main();
return 0;
}
Submission Info
| Submission Time |
|
| Task |
G - Cubic? |
| User |
Plan8 |
| Language |
C++ 20 (gcc 12.2) |
| Score |
600 |
| Code Size |
6228 Byte |
| Status |
AC |
| Exec Time |
1024 ms |
| Memory |
74232 KiB |
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt |
| All |
sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt, test_43.txt, test_44.txt, test_45.txt, test_46.txt, test_47.txt, test_48.txt, test_49.txt, test_50.txt, test_51.txt, test_52.txt, test_53.txt, test_54.txt, test_55.txt, test_56.txt, test_57.txt, test_58.txt, test_59.txt, test_60.txt, test_61.txt, test_62.txt, test_63.txt, test_64.txt, test_65.txt, test_66.txt, test_67.txt, test_68.txt, test_69.txt |
| Case Name |
Status |
Exec Time |
Memory |
| sample_01.txt |
AC |
15 ms |
14724 KiB |
| test_01.txt |
AC |
15 ms |
14676 KiB |
| test_02.txt |
AC |
305 ms |
48136 KiB |
| test_03.txt |
AC |
101 ms |
21132 KiB |
| test_04.txt |
AC |
250 ms |
35820 KiB |
| test_05.txt |
AC |
398 ms |
46640 KiB |
| test_06.txt |
AC |
45 ms |
18432 KiB |
| test_07.txt |
AC |
138 ms |
27844 KiB |
| test_08.txt |
AC |
608 ms |
57528 KiB |
| test_09.txt |
AC |
33 ms |
19596 KiB |
| test_10.txt |
AC |
138 ms |
38052 KiB |
| test_11.txt |
AC |
382 ms |
45640 KiB |
| test_12.txt |
AC |
174 ms |
32168 KiB |
| test_13.txt |
AC |
453 ms |
35108 KiB |
| test_14.txt |
AC |
894 ms |
53196 KiB |
| test_15.txt |
AC |
289 ms |
38128 KiB |
| test_16.txt |
AC |
292 ms |
39432 KiB |
| test_17.txt |
AC |
229 ms |
34680 KiB |
| test_18.txt |
AC |
54 ms |
21300 KiB |
| test_19.txt |
AC |
296 ms |
37196 KiB |
| test_20.txt |
AC |
122 ms |
27232 KiB |
| test_21.txt |
AC |
401 ms |
49284 KiB |
| test_22.txt |
AC |
479 ms |
53968 KiB |
| test_23.txt |
AC |
595 ms |
56724 KiB |
| test_24.txt |
AC |
403 ms |
49324 KiB |
| test_25.txt |
AC |
478 ms |
53980 KiB |
| test_26.txt |
AC |
594 ms |
56720 KiB |
| test_27.txt |
AC |
403 ms |
49296 KiB |
| test_28.txt |
AC |
478 ms |
53928 KiB |
| test_29.txt |
AC |
596 ms |
56704 KiB |
| test_30.txt |
AC |
402 ms |
49216 KiB |
| test_31.txt |
AC |
478 ms |
53972 KiB |
| test_32.txt |
AC |
594 ms |
56728 KiB |
| test_33.txt |
AC |
360 ms |
57772 KiB |
| test_34.txt |
AC |
361 ms |
57736 KiB |
| test_35.txt |
AC |
360 ms |
57672 KiB |
| test_36.txt |
AC |
545 ms |
56692 KiB |
| test_37.txt |
AC |
768 ms |
62568 KiB |
| test_38.txt |
AC |
655 ms |
59732 KiB |
| test_39.txt |
AC |
136 ms |
40408 KiB |
| test_40.txt |
AC |
516 ms |
56756 KiB |
| test_41.txt |
AC |
675 ms |
63100 KiB |
| test_42.txt |
AC |
545 ms |
56588 KiB |
| test_43.txt |
AC |
768 ms |
62492 KiB |
| test_44.txt |
AC |
895 ms |
62484 KiB |
| test_45.txt |
AC |
342 ms |
58692 KiB |
| test_46.txt |
AC |
329 ms |
56616 KiB |
| test_47.txt |
AC |
495 ms |
62852 KiB |
| test_48.txt |
AC |
542 ms |
56700 KiB |
| test_49.txt |
AC |
766 ms |
62456 KiB |
| test_50.txt |
AC |
654 ms |
59708 KiB |
| test_51.txt |
AC |
344 ms |
58664 KiB |
| test_52.txt |
AC |
514 ms |
56736 KiB |
| test_53.txt |
AC |
752 ms |
62888 KiB |
| test_54.txt |
AC |
543 ms |
56684 KiB |
| test_55.txt |
AC |
768 ms |
62580 KiB |
| test_56.txt |
AC |
902 ms |
62536 KiB |
| test_57.txt |
AC |
517 ms |
58636 KiB |
| test_58.txt |
AC |
339 ms |
56600 KiB |
| test_59.txt |
AC |
663 ms |
62808 KiB |
| test_60.txt |
AC |
547 ms |
56692 KiB |
| test_61.txt |
AC |
766 ms |
62520 KiB |
| test_62.txt |
AC |
430 ms |
56788 KiB |
| test_63.txt |
AC |
683 ms |
61848 KiB |
| test_64.txt |
AC |
515 ms |
56724 KiB |
| test_65.txt |
AC |
668 ms |
62872 KiB |
| test_66.txt |
AC |
544 ms |
56744 KiB |
| test_67.txt |
AC |
767 ms |
62496 KiB |
| test_68.txt |
AC |
653 ms |
59668 KiB |
| test_69.txt |
AC |
1024 ms |
74232 KiB |