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
AC × 1
AC × 70
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