Advertisement
Ahmed_Negm

A- TLE java

Oct 6th, 2024
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class Solution {
  5.     static Map<Long, Boolean> dp = new HashMap<>();
  6.  
  7.     static boolean good(long n) {
  8.         if (dp.containsKey(n)) return dp.get(n);
  9.         long save = n;
  10.         for (long i = 2; i * i <= n; i++) {
  11.             int cnt = 0;
  12.             while (n % i == 0) {
  13.                 cnt++;
  14.                 n /= i;
  15.             }
  16.             if (cnt > 1) {
  17.                 dp.put(save, false);
  18.                 return false;
  19.             }
  20.         }
  21.         if (n > 1) {
  22.             // The number itself is prime, so it has one prime factor with exponent 1
  23.             // This is still considered "good"
  24.         }
  25.         dp.put(save, true);
  26.         return true;
  27.     }
  28.  
  29.     static class SegmentTree {
  30.         int size;
  31.         long[] tree;
  32.  
  33.         SegmentTree(int n) {
  34.             size = 1;
  35.             while (size < n) size *= 2;
  36.             tree = new long[2 * size];
  37.         }
  38.  
  39.         void build(List<Long> a) {
  40.             build(a, 0, 0, size);
  41.         }
  42.  
  43.         void build(List<Long> a, int x, int lx, int rx) {
  44.             if (rx - lx == 1) {
  45.                 if (lx < a.size()) {
  46.                     tree[x] = a.get(lx);
  47.                 }
  48.                 return;
  49.             }
  50.             int m = (lx + rx) / 2;
  51.             build(a, 2 * x + 1, lx, m);
  52.             build(a, 2 * x + 2, m, rx);
  53.             tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
  54.         }
  55.  
  56.         void update(int l, int r, long v) {
  57.             update(l, r, v, 0, 0, size);
  58.         }
  59.  
  60.         void update(int l, int r, long v, int x, int lx, int rx) {
  61.             if (lx >= r || l >= rx) return;
  62.             if (lx >= l && rx <= r) {
  63.                 tree[x] = v * (rx - lx);
  64.                 return;
  65.             }
  66.             int m = (lx + rx) / 2;
  67.             update(l, r, v, 2 * x + 1, lx, m);
  68.             update(l, r, v, 2 * x + 2, m, rx);
  69.             tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
  70.         }
  71.  
  72.         long sum(int l, int r) {
  73.             return sum(l, r, 0, 0, size);
  74.         }
  75.  
  76.         long sum(int l, int r, int x, int lx, int rx) {
  77.             if (lx >= r || l >= rx) return 0;
  78.             if (lx >= l && rx <= r) return tree[x];
  79.             int m = (lx + rx) / 2;
  80.             return sum(l, r, 2 * x + 1, lx, m) + sum(l, r, 2 * x + 2, m, rx);
  81.         }
  82.     }
  83.  
  84.     public static void main(String[] args) throws IOException {
  85.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  86.         PrintWriter out = new PrintWriter(System.out);
  87.  
  88.         StringTokenizer st = new StringTokenizer(br.readLine());
  89.         int n = Integer.parseInt(st.nextToken());
  90.         int q = Integer.parseInt(st.nextToken());
  91.  
  92.         List<Long> a = new ArrayList<>();
  93.         st = new StringTokenizer(br.readLine());
  94.         for (int i = 0; i < n; i++) {
  95.             long x = Long.parseLong(st.nextToken());
  96.             a.add(good(x) ? 1L : 0L);
  97.         }
  98.  
  99.         SegmentTree seg = new SegmentTree(n);
  100.         seg.build(a);
  101.  
  102.         while (q-- > 0) {
  103.             st = new StringTokenizer(br.readLine());
  104.             int type = Integer.parseInt(st.nextToken());
  105.             int l = Integer.parseInt(st.nextToken()) - 1;
  106.             int r = Integer.parseInt(st.nextToken());
  107.             if (type == 2) {
  108.                 out.println(seg.sum(l, r));
  109.             } else {
  110.                 long x = Long.parseLong(st.nextToken());
  111.                 seg.update(l, r, good(x) ? 1 : 0);
  112.             }
  113.         }
  114.  
  115.         out.close();
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement