Advertisement
Ahmed_Negm

A WA CPP

Oct 6th, 2024
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long int
  5. #define X first
  6. #define Y second
  7.  
  8. const int N = 1e8 + 1, M = 1e5 + 2;
  9. int spf[N];
  10.  
  11. void sieve()
  12. {
  13.     vector<int> primes;
  14.     for (int i = 2; i < N; ++i)
  15.     {
  16.         if (spf[i] == 0)
  17.         {
  18.             spf[i] = i;
  19.             primes.push_back(i);
  20.         }
  21.         for (int j = 0; j < primes.size() && primes[j] <= spf[i] && i * primes[j] < N; ++j)
  22.         {
  23.             spf[i * primes[j]] = primes[j];
  24.         }
  25.     }
  26. }
  27.  
  28. // write a segment tree to set range to 1 or 0 and get sum
  29.  
  30. int lazy[4 * M], tree[4 * M], a[M];
  31.  
  32. int is_good(int num)
  33. {
  34.     while (num > 1)
  35.     {
  36.         int p = spf[num];
  37.         int cnt = 0;
  38.         while (num % p == 0)
  39.         {
  40.             num /= p;
  41.             cnt++;
  42.         }
  43.         if (cnt % 2 == 0)
  44.             return 0;
  45.     }
  46.     return 1;
  47. }
  48.  
  49. void build(int node, int start, int end)
  50. {
  51.     if (start == end)
  52.     {
  53.         tree[node] = is_good(a[start]);
  54.         return;
  55.     }
  56.     int mid = (start + end) / 2;
  57.     build(2 * node, start, mid);
  58.     build(2 * node + 1, mid + 1, end);
  59.     tree[node] = tree[2 * node] + tree[2 * node + 1];
  60. }
  61.  
  62. void propogate(int node, int start, int end)
  63. {
  64.     if (lazy[node] == -1)
  65.         return;
  66.     if (lazy[node] == 0)
  67.         tree[node] = 0;
  68.     else
  69.         tree[node] = end - start + 1;
  70.     if (start != end)
  71.     {
  72.         lazy[2 * node] = lazy[node];
  73.         lazy[2 * node + 1] = lazy[node];
  74.     }
  75.     lazy[node] = -1;
  76. }
  77.  
  78. void update(int node, int start, int end, int l, int r, int val)
  79. {
  80.     propogate(node, start, end);
  81.     if (start > r || end < l)
  82.         return;
  83.     if (start >= l && end <= r)
  84.     {
  85.         lazy[node] = val;
  86.         propogate(node, start, end);
  87.         return;
  88.     }
  89.     int mid = (start + end) / 2;
  90.     update(2 * node, start, mid, l, r, val);
  91.     update(2 * node + 1, mid + 1, end, l, r, val);
  92.     tree[node] = tree[2 * node] + tree[2 * node + 1];
  93. }
  94.  
  95. int query(int node, int start, int end, int l, int r)
  96. {
  97.     propogate(node, start, end);
  98.     if (start > r || end < l)
  99.         return 0;
  100.     if (start >= l && end <= r)
  101.         return tree[node];
  102.     int mid = (start + end) / 2;
  103.     return query(2 * node, start, mid, l, r) + query(2 * node + 1, mid + 1, end, l, r);
  104. }
  105.  
  106. void solve()
  107. {
  108.     sieve();
  109.     int n, q;
  110.     cin >> n >> q;
  111.     memset(lazy, -1, sizeof(lazy));
  112.     memset(tree, 0, sizeof(tree));
  113.     for (int i = 1; i <= n; ++i)
  114.         cin >> a[i];
  115.     build(1, 1, n);
  116.     while (q--)
  117.     {
  118.         int type, l, r, x;
  119.         cin >> type >> l >> r;
  120.         if (type == 2)
  121.         {
  122.             cout << query(1, 1, n, l, r) << '\n';
  123.         }
  124.         else
  125.         {
  126.             cin >> x;
  127.             update(1, 1, n, l, r, is_good(x));
  128.         }
  129.     }
  130. }
  131.  
  132. int main()
  133. {
  134.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  135. #ifndef ONLINE_JUDGE
  136.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  137. #endif
  138.     int tc = 1;
  139.     // cin>>tc;
  140.     for (int i = 1; i <= tc; ++i)
  141.     {
  142.         solve();
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement