Advertisement
arujbansal

Untitled

Apr 21st, 2021
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <map>
  5. #include <set>
  6. #include <array>
  7. #include <stack>
  8. #include <queue>
  9. #include <random>
  10. #include <numeric>
  11. #include <functional>
  12. #include <chrono>
  13. #include <utility>
  14. #include <iomanip>
  15. #include <assert.h>
  16.  
  17. using namespace std;
  18.  
  19. void dbg_out() { cerr << endl; }
  20. template<typename Head, typename... Tail>
  21. void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
  22. #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
  23.  
  24. #define rng_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
  25. #define rng_seed(x) mt19937 rng(x)
  26. #define all(x) (x).begin(), (x).end()
  27. #define sz(x) (int) (x).size()
  28. // #define int long long
  29.  
  30. const int MXN = 1e5 + 5, INF = 1e9 + 5, K = 19;
  31. int N, Q;
  32. int spf[MXN], factor_cnt[MXN], par[MXN][K], depth[MXN];
  33. vector<int> factors[MXN];
  34. vector<int> g[MXN];
  35.  
  36. bool add(int idx) {
  37.     for (const auto &factor : factors[idx])
  38.         if (factor_cnt[factor] > 0)
  39.             return false;
  40.  
  41.     for (const auto &factor : factors[idx])
  42.         factor_cnt[factor]++;
  43.  
  44.     return true;
  45. }
  46.  
  47. void remove(int idx) {
  48.     for (const auto &factor : factors[idx])
  49.         factor_cnt[factor]--;
  50. }
  51.  
  52. void dfs(int u, int p, int dep) {
  53.     depth[u] = dep;
  54.  
  55.     for (int j = 1; j < K; j++)
  56.         par[u][j] = par[par[u][j - 1]][j - 1];
  57.  
  58.     for (const auto &v : g[u]) {
  59.         if (v == p) continue;
  60.  
  61.         par[v][0] = u;
  62.         dfs(v, u, dep + 1);
  63.     }
  64. }
  65.  
  66. int query(int l, int r) {
  67.     int u = l;
  68.  
  69.     for (int j = K - 1; j >= 0; j--) {
  70.         int lift = par[u][j];
  71.  
  72.         if (lift > r) continue;
  73.         u = lift;
  74.     }
  75.  
  76.     u = par[u][0];
  77.     return depth[l] - depth[u];
  78. }
  79.  
  80. void solve() {
  81.     cin >> N >> Q;
  82.        
  83.     vector<int> A(N);
  84.     for (auto &x : A)
  85.         cin >> x;
  86.  
  87.  
  88.     spf[1] = 1;
  89.     for (int i = 2; i < MXN; i++) {
  90.         if (spf[i] > 0) continue;
  91.  
  92.         for (int j = i; j < MXN; j += i)
  93.             spf[j] = i;
  94.     }
  95.  
  96.     for (int i = 0; i < N; i++) {
  97.         int x = A[i];
  98.  
  99.         while (x != 1) {
  100.             factors[i].push_back(spf[x]);
  101.             x /= spf[x];
  102.         }
  103.     }
  104.  
  105.     vector<int> earliest(N, N + 1);
  106.     for (int i = 0, j = 0; i < N; i++) {
  107.         while (j < N && add(j))
  108.             j++;
  109.  
  110.         earliest[i] = j;
  111.  
  112.         remove(i);
  113.     }
  114.  
  115.     for (int i = 0; i < N; i++) {
  116.         g[i].push_back(earliest[i]);
  117.         g[earliest[i]].push_back(i);
  118.     }
  119.  
  120.     for (int i = 0; i < MXN; i++)
  121.         for (int j = 0; j < K; j++)
  122.             par[i][j] = N;
  123.  
  124.     dfs(N, -1, 0);
  125.  
  126.     while (Q--) {
  127.         int l, r;
  128.         cin >> l >> r;
  129.         l--, r--;
  130.  
  131.         cout << query(l, r) << "\n";
  132.     }
  133. }
  134.  
  135. signed main() {
  136.     ios_base::sync_with_stdio(false);
  137.     cin.tie(nullptr);
  138.  
  139.     int TC = 1;
  140.     // cin >> TC;
  141.     while (TC--) solve();
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement