Advertisement
a53

numbers_tree

a53
Jan 14th, 2021
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. #include <fstream>
  2. #include <bitset>
  3. using namespace std;
  4. const int N=1e5+5,maxNr=1e6+5;
  5. struct nod
  6. {
  7. /// st = cate nr prime consecutive sunt in acest interval de la inceput la sfarsit
  8. /// dr = cate nr prime consecutive sunt in acest interval de la sfarsit la inceput
  9. /// secventaMax = secventa max de nr prime consecutive
  10. /// totCompuse = cate nr compuse sunt in tot nodul
  11. int st=0,dr=0,secventaMax=0,totCompuse=0;
  12. } arb[4*N],nullElement;
  13. int lazy[4*N]; /// retine ce numar trebuie sa fie de aici in jos
  14. int n,val,ql,qr;
  15. bitset<maxNr>prim;
  16.  
  17. inline void updateLazy(int tl,int tr,int ti)
  18. {
  19. if (prim[lazy[ti]])
  20. {
  21. arb[ti].st=tr-tl+1;
  22. arb[ti].dr=tr-tl+1;
  23. arb[ti].secventaMax=tr-tl+1;
  24. arb[ti].totCompuse=0;
  25. }
  26. else
  27. {
  28. arb[ti].st=0;
  29. arb[ti].dr=0;
  30. arb[ti].secventaMax=0;
  31. arb[ti].totCompuse=tr-tl+1;
  32. }
  33. if(tl<tr)
  34. {
  35. lazy[ti*2]=lazy[ti];
  36. lazy[ti*2+1]=lazy[ti];
  37. }
  38. lazy[ti]=0;
  39. }
  40.  
  41. void updateRange(int tl=1,int tr=n,int ti=1)
  42. {
  43. if(lazy[ti])
  44. updateLazy(tl,tr,ti);
  45. if(tr<ql||qr<tl) /// Nu este in interval
  46. return;
  47. if(ql<=tl&&tr<=qr) /// Este complet in interval
  48. {
  49. lazy[ti]=val;
  50. updateLazy(tl,tr,ti);
  51. return;
  52. }
  53. /// Partial in interval
  54. int mid=(tl+tr)/2;
  55. updateRange(tl,mid,ti*2);
  56. updateRange(mid+1,tr,ti*2+1);
  57. arb[ti].st=max(arb[ti*2].st,(arb[ti*2].totCompuse==0)?arb[ti*2].st+arb[ti*2+1].st:0);
  58. arb[ti].dr=max(arb[ti*2+1].dr,(arb[ti*2+1].totCompuse==0)?arb[ti*2+1].dr+arb[ti*2].dr:0);
  59. arb[ti].secventaMax=max(max(arb[ti*2].secventaMax,arb[ti*2+1].secventaMax),arb[ti*2].dr+arb[ti*2+1].st);
  60. arb[ti].totCompuse=arb[ti*2].totCompuse+arb[ti*2+1].totCompuse;
  61. }
  62.  
  63. int queryRange(int tl=1,int tr=n,int ti=1)
  64. {
  65. if(lazy[ti])
  66. updateLazy(tl,tr,ti);
  67. if(tr<ql||qr<tl) /// Nu este in interval
  68. return 0;
  69. if(ql<=tl&&tr<=qr) /// Este complet in interval
  70. return arb[ti].totCompuse;
  71. /// Partial in interval
  72. int mid=(tl+tr)/2;
  73. return queryRange(tl,mid,ti*2)+queryRange(mid+1,tr,ti*2+1);
  74. }
  75.  
  76. nod queryRange1(int tl=1,int tr=n,int ti=1)
  77. {
  78. if(lazy[ti])
  79. updateLazy(tl,tr,ti);
  80. if(tr<ql||qr<tl) /// Nu este in interval
  81. return nullElement;
  82. if(ql<=tl&&tr<=qr) /// Este complet in interval
  83. return arb[ti];
  84. /// Partial in interval
  85. int mid=(tl+tr)/2;
  86. nod left=queryRange1(tl,mid,ti*2);
  87. nod right=queryRange1(mid+1,tr,ti*2+1);
  88. nod result;
  89. result.st=max(left.st,(left.totCompuse==0)?left.st+right.st:0);
  90. result.dr=max(right.dr,(right.totCompuse==0)?right.dr+left.dr:0);
  91. result.secventaMax=max(max(left.secventaMax,right.secventaMax),left.dr+right.st);
  92. result.totCompuse=left.totCompuse+right.totCompuse;
  93. return result;
  94. }
  95.  
  96. void ciur()
  97. {
  98. prim.set();
  99. int mult;
  100. for(int i=2;i<maxNr;++i)
  101. {
  102. if(prim[i])
  103. {
  104. mult=i*2;
  105. while(mult<maxNr)
  106. prim[mult]=false,mult+=i;
  107. }
  108. }
  109. }
  110.  
  111. int main()
  112. {
  113. ios::sync_with_stdio(false);
  114. ciur();
  115. int op,q;
  116. ifstream f("numbers_tree.in");
  117. f>>n>>q;
  118. for(int i=1;i<=n;++i)
  119. f>>val,ql=qr=i,updateRange();
  120. ofstream g("numbers_tree.out");
  121. while(q--)
  122. {
  123. f>>op>>ql>>qr;
  124. if(op==1) /// Tot intervalul [ql,qr] va avea noua valoare val
  125. f>>val,updateRange();
  126. else
  127. if(op==2) /// Cate nr de la st la dr sunt compuse
  128. g<<queryRange()<<'\n';
  129. else /// Cea mai lunga secventa de numere prime
  130. g<<queryRange1().secventaMax<<'\n';
  131. }
  132. return 0;
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement