Advertisement
Ahmed_Negm

A WA Java

Oct 6th, 2024
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class Solution {
  5.     static final int N = 100000001;
  6.     static final int M = 100002;
  7.     static int[] spf = new int[N];
  8.     static int[] lazy = new int[4 * M];
  9.     static int[] tree = new int[4 * M];
  10.     static int[] a = new int[M];
  11.  
  12.     static void sieve() {
  13.         List<Integer> primes = new ArrayList<>();
  14.         for (int i = 2; i < N; ++i) {
  15.             if (spf[i] == 0) {
  16.                 spf[i] = i;
  17.                 primes.add(i);
  18.             }
  19.             for (int j = 0; j < primes.size() && primes.get(j) <= spf[i] && i * primes.get(j) < N; ++j) {
  20.                 spf[i * primes.get(j)] = primes.get(j);
  21.             }
  22.         }
  23.     }
  24.  
  25.     static int isGood(int num) {
  26.         while (num > 1) {
  27.             int p = spf[num];
  28.             int cnt = 0;
  29.             while (num % p == 0) {
  30.                 num /= p;
  31.                 cnt++;
  32.             }
  33.             if (cnt % 2 == 0)
  34.                 return 0;
  35.         }
  36.         return 1;
  37.     }
  38.  
  39.     static void build(int node, int start, int end) {
  40.         if (start == end) {
  41.             tree[node] = isGood(a[start]);
  42.             return;
  43.         }
  44.         int mid = (start + end) / 2;
  45.         build(2 * node, start, mid);
  46.         build(2 * node + 1, mid + 1, end);
  47.         tree[node] = tree[2 * node] + tree[2 * node + 1];
  48.     }
  49.  
  50.     static void propagate(int node, int start, int end) {
  51.         if (lazy[node] == -1)
  52.             return;
  53.         if (lazy[node] == 0)
  54.             tree[node] = 0;
  55.         else
  56.             tree[node] = end - start + 1;
  57.         if (start != end) {
  58.             lazy[2 * node] = lazy[node];
  59.             lazy[2 * node + 1] = lazy[node];
  60.         }
  61.         lazy[node] = -1;
  62.     }
  63.  
  64.     static void update(int node, int start, int end, int l, int r, int val) {
  65.         propagate(node, start, end);
  66.         if (start > r || end < l)
  67.             return;
  68.         if (start >= l && end <= r) {
  69.             lazy[node] = val;
  70.             propagate(node, start, end);
  71.             return;
  72.         }
  73.         int mid = (start + end) / 2;
  74.         update(2 * node, start, mid, l, r, val);
  75.         update(2 * node + 1, mid + 1, end, l, r, val);
  76.         tree[node] = tree[2 * node] + tree[2 * node + 1];
  77.     }
  78.  
  79.     static int query(int node, int start, int end, int l, int r) {
  80.         propagate(node, start, end);
  81.         if (start > r || end < l)
  82.             return 0;
  83.         if (start >= l && end <= r)
  84.             return tree[node];
  85.         int mid = (start + end) / 2;
  86.         return query(2 * node, start, mid, l, r) + query(2 * node + 1, mid + 1, end, l, r);
  87.     }
  88.  
  89.     static void solve(BufferedReader br, PrintWriter out) throws IOException {
  90.         sieve();
  91.         String[] input = br.readLine().split(" ");
  92.         int n = Integer.parseInt(input[0]);
  93.         int q = Integer.parseInt(input[1]);
  94.         Arrays.fill(lazy, -1);
  95.         input = br.readLine().split(" ");
  96.         for (int i = 1; i <= n; ++i)
  97.             a[i] = Integer.parseInt(input[i - 1]);
  98.         build(1, 1, n);
  99.         while (q-- > 0) {
  100.             input = br.readLine().split(" ");
  101.             int type = Integer.parseInt(input[0]);
  102.             int l = Integer.parseInt(input[1]);
  103.             int r = Integer.parseInt(input[2]);
  104.             if (type == 2) {
  105.                 out.println(query(1, 1, n, l, r));
  106.             } else {
  107.                 int x = Integer.parseInt(input[3]);
  108.                 update(1, 1, n, l, r, isGood(x));
  109.             }
  110.         }
  111.     }
  112.  
  113.     public static void main(String[] args) throws IOException {
  114.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  115.         PrintWriter out = new PrintWriter(System.out);
  116.         int tc = 1;
  117.         // tc = Integer.parseInt(br.readLine());
  118.         for (int i = 1; i <= tc; ++i) {
  119.             solve(br, out);
  120.         }
  121.         out.close();
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement