Advertisement
mihaimarcel21

numbers_tree_nu_gata

Dec 24th, 2020
784
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. /**
  2. am afisat si arborele si raspunsurile la operatii cu tab*/
  3. #include <bits/stdc++.h>///nu ....nr. compuse 0 si prime 1
  4. #define MAX 1000001      /// nu memorez numerele ci 1 pentru prime si 0 pt. compuse
  5. #define NMAX 100005         /// pentru operatia 3 nu stiu cum sa fac ...
  6. using namespace std;
  7. ifstream fin("numbers_tree.in");
  8. ofstream fout("numbers_tree.out");
  9. int n, ar[NMAX], Q,t;
  10. bool isPrime[MAX];
  11. int tree[4*NMAX];
  12. void sieveOfEratosthenes(bool isPrime[])
  13. {
  14.     isPrime[0]=isPrime[1] = false;
  15.     for(int p = 2; p * p <= MAX; p++)
  16.     {
  17.         if (isPrime[p] == true)
  18.             for(int i = p * 2; i <= MAX; i += p)
  19.                 isPrime[i] = false;
  20.     }
  21. }
  22. void showSegTree(int n)  /// afisat pe nivele ...
  23. {
  24.     int i, j, h = ceil(log2(n));
  25.     for(i=0 ; i<=h ; ++i)
  26.     {
  27.         for(j=0 ; j<pow(2, i) ; ++j)
  28.             cout<<tree[int(pow(2, i)-1 + j)]<<' ';
  29.         cout<<'\n';
  30.     }
  31.     cout<<"\n_______________________\n";
  32. }
  33. int getMid(int s, int e)
  34. {
  35.     return s + (e - s) / 2;
  36. }
  37. int queryCompositesUtil(int st[], int ss, int se, int qs, int qe, int index)
  38. {
  39.     if (qs <= ss && qe >= se)
  40.         return st[index];
  41.     if (se < qs || ss > qe)
  42.         return 0;
  43.     int mid = getMid(ss, se);
  44.     return queryCompositesUtil(st, ss, mid, qs, qe, 2 * index + 1)
  45.            + queryCompositesUtil(st, mid + 1, se, qs, qe, 2 * index + 2);
  46. }
  47. void queryComposites(int st[], int n, int qs, int qe)
  48. {
  49.     int compositesInRange = queryCompositesUtil(st, 0, n - 1, qs, qe, 0);
  50.     if(t==2)
  51.         cout << '\t' <<(qe - qs +1) - compositesInRange << "\n";
  52.     else
  53.         cout << '\t' << compositesInRange<<'\n';
  54. }
  55. int constSegTree(int strt, int endi, int idx)
  56. {
  57.   /// Saves tree[idx] = ar[strt] and then returns tree[idx]
  58.     if(strt == endi)
  59.         return tree[idx] = ar[strt];
  60.     int mid = (strt + endi) / 2;
  61.     return tree[idx] = constSegTree(strt, mid, 2*idx+1) +
  62.             constSegTree(mid+1, endi, 2*idx+2);
  63. }
  64. void ConstSegTree(int n)
  65. {
  66.     constSegTree(0, n-1, 0);
  67. }
  68. void updtRange(int strt, int endi, int val, int l, int r, int idx)
  69. {
  70.   /// Completly ouside the desired range
  71.     if(endi < l || r < strt || l>r)
  72.         return;
  73.   /// Leaf node reached
  74.     if(l == r)
  75.     {
  76.         tree[idx] = val;  /// Update the leaves
  77.         return;
  78.     }
  79.     int mid = (l + r) / 2;
  80.     updtRange(strt, endi, val, l, mid, 2*idx+1);
  81.     updtRange(strt, endi, val, mid+1, r, 2*idx+2);
  82.   /// Update the intermediate nodes
  83.     tree[idx] = tree[2*idx+1] + tree[2*idx+2];
  84. }
  85. void UpdtRange(int n, int strt, int endi, int val)
  86. {
  87.     updtRange(strt, endi, val, 0, n-1, 0);
  88. }
  89. int main()
  90. {
  91.     int i, j, x;
  92.     memset(isPrime, true, sizeof isPrime);
  93.     sieveOfEratosthenes(isPrime);
  94.     fin >> n >> Q;
  95.     for(i = 0; i < n; i++)
  96.     {
  97.         fin >> x;
  98.         if(isPrime[x])
  99.             ar[i]=1;
  100.     }
  101.     ConstSegTree(n);
  102.     while(Q--)
  103.     {
  104.         fin >> t;
  105.         if(t == 1)
  106.         {
  107.             fin >> i >> j >> x;
  108.             if(isPrime[x])
  109.                 UpdtRange(n,i-1,j-1,1);
  110.             else
  111.                 UpdtRange(n,i-1,j-1,0);
  112.             showSegTree(n);
  113.         }
  114.         else ///if(t==2)   /// AICI PENTRU t==2 CRED CA AFISEAZA CORECT, DAR pt. t==3 AFISEAZA TOTAL PRIME IN RANGE
  115.         {
  116.             fin >> i >> j;
  117.             queryComposites(tree,n,i-1,j-1);
  118.         }
  119.     }
  120.     return 0;
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement