Advertisement
a53

numbers_tre_Adrian

a53
Dec 24th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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