Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. ll n,q;
  7. ll a[100000];
  8. ll b[100000];
  9. ll treeP[400004];
  10. ll treeS[400004];
  11. bool primes[100000];
  12. vector<ll> ans;
  13.  
  14. ll complite(ll x)
  15. {
  16. for(ll i=2;i<=x;i++){
  17. primes[i]=true;
  18. }
  19. for(ll i=2;i<=x;i++){
  20. for(ll j=i*i;j<=x;j+=i){
  21. primes[j]=false;
  22. }
  23. }
  24. }
  25.  
  26. void build_treeP(ll v, ll tl, ll tr)
  27. {
  28. if(tl==tr){
  29. treeP[v]=b[tl];
  30. }else{
  31. ll tm=(tl+tr)/2;
  32. build_treeP(v*2,tl,tm);
  33. build_treeP(v*2+1,tm+1,tr);
  34. treeP[v]=treeP[v*2]+treeP[v*2+1];
  35. }
  36. }
  37.  
  38. void build_treeS(ll v, ll tl, ll tr)
  39. {
  40. if(tl==tr){
  41. treeS[v]=a[tl];
  42. }else{
  43. ll tm=(tl+tr)/2;
  44. build_treeS(v*2,tl,tm);
  45. build_treeS(v*2+1,tm+1,tr);
  46. treeS[v]=treeS[v*2]+treeS[v*2+1];
  47. }
  48. }
  49.  
  50. ll get_sumP(ll l, ll r, ll v, ll tl, ll tr)
  51. {
  52. if(l<=tl&&tr<=r){
  53. return treeP[v];
  54. }
  55. if(tr<l || r<tl){
  56. return 0;
  57. }
  58. ll tm=(tl+tr)/2;
  59. return get_sumP(l,r,v*2,tl,tm)+get_sumP(l,r,v*2+1,tm+1,tr);
  60. }
  61.  
  62. ll get_sumS(ll l, ll r, ll v, ll tl, ll tr)
  63. {
  64. if(l<=tl&&tr<=r){
  65. return treeS[v];
  66. }
  67. if(tr<l || r<tl){
  68. return 0;
  69. }
  70. ll tm=(tl+tr)/2;
  71. return get_sumS(l,r,v*2,tl,tm)+get_sumS(l,r,v*2+1,tm+1,tr);
  72. }
  73.  
  74. void updateP(ll idx, ll val, ll v, ll tl, ll tr)
  75. {
  76. if(idx<=tl&&tr<=idx){
  77. b[idx]=val;
  78. treeP[v]=val;
  79. return;
  80. }
  81. if(idx<tl || idx>tr){
  82. return;
  83. }
  84. ll tm=(tl+tr)/2;
  85. updateP(idx,val,v*2,tl,tm);
  86. updateP(idx,val,v*2+1,tm+1,tr);
  87. treeP[v]=treeP[v*2]+treeP[v*2+1];
  88. }
  89.  
  90. void updateS(ll idx, ll val, ll v, ll tl, ll tr)
  91. {
  92. if(idx<=tl&&tr<=idx){
  93. a[idx]=val;
  94. treeS[v]=val;
  95. return;
  96. }
  97. if(idx<tl || idx>tr){
  98. return;
  99. }
  100. ll tm=(tl+tr)/2;
  101. updateS(idx,val,v*2,tl,tm);
  102. updateS(idx,val,v*2+1,tm+1,tr);
  103. treeS[v]=treeS[v*2]+treeS[v*2+1];
  104. }
  105.  
  106. int32_t main() {
  107. cin>>n;
  108. complite(100000);
  109. for(ll i=0;i<n;i++){
  110. ll temp; cin>>temp;
  111. if(primes[temp]){
  112. b[i]=temp;
  113. a[i]=0;
  114. }else{
  115. a[i]=temp;
  116. b[i]=0;
  117. }
  118. }
  119. build_treeP(1,0,n-1);
  120. build_treeS(1,0,n-1);
  121. cin>>q;
  122. for(ll i=0;i<q;i++){
  123. ll type; cin>>type;
  124. if(type==1){
  125. ll idx,val; cin>>idx>>val; idx--;
  126. if(primes[val]){
  127. updateP(idx,val,1,0,n-1);
  128. updateS(idx,0,1,0,n-1);
  129. }else{
  130. updateS(idx,val,1,0,n-1);
  131. updateP(idx,0,1,0,n-1);
  132. }
  133. }
  134. if(type==2){
  135. ll l,r; cin>>l>>r; l--; r--;
  136. ans.push_back(get_sumP(l,r,1,0,n-1));
  137. }
  138. if(type==3){
  139. ll l,r; cin>>l>>r; l--; r--;
  140. ans.push_back(get_sumS(l,r,1,0,n-1));
  141. }
  142. }
  143. for(ll u : ans){
  144. cout<<u<<endl;
  145. }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement