Advertisement
TheAnshul

Counting Primes

Jun 26th, 2018
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.63 KB | None | 0 0
  1. /***************************************************************************
  2.  * #######                    #                                            *
  3.  *    #     #    #  ######   # #    #    #   ####   #    #  #    #  #      *
  4.  *    #     #    #  #       #   #   ##   #  #       #    #  #    #  #      *
  5.  *    #     ######  #####  #     #  # #  #   ####   ######  #    #  #      *
  6.  *    #     #    #  #      #######  #  # #       #  #    #  #    #  #      *
  7.  *    #     #    #  #      #     #  #   ##  #    #  #    #  #    #  #      *
  8.  *    #     #    #  ###### #     #  #    #   ####   #    #   ####   ###### *
  9.  ***************************************************************************/
  10. #include<bits/stdc++.h>
  11. #define ll          long long
  12. #define pb          push_back
  13. #define endl        '\n'
  14. #define pii         pair<ll int,ll int>
  15. #define vi          vector<ll int>
  16. #define all(a)      (a).begin(),(a).end()
  17. #define F           first
  18. #define S           second
  19. #define sz(x)       (ll int)x.size()
  20. #define hell        1000000007
  21. #define rep(i,a,b)  for(ll int i=a;i<b;i++)
  22. #define lbnd        lower_bound
  23. #define ubnd        upper_bound
  24. #define bs          binary_search
  25. #define mp          make_pair
  26. using namespace std;
  27.  
  28. #define N  10005
  29. #define MAXN  1000005
  30. bool prime[MAXN];
  31. ll tree[4*N];
  32. ll lazy[4*N]={0};
  33. ll v[N];
  34. void build(ll node,ll start,ll end)
  35. {
  36.     if(start==end)
  37.     {
  38.         if(prime[v[start]])
  39.             tree[node]=1;
  40.         else
  41.             tree[node]=0;
  42.         return;
  43.     }
  44.     ll mid=(start+end)/2;
  45.     build(2*node,start,mid);
  46.     build(2*node+1,mid+1,end);
  47.     tree[node]=tree[2*node]+tree[2*node+1];
  48. }
  49. void update(ll node,ll start,ll end,ll l,ll r,ll val)
  50. {
  51.     if(lazy[node]==2)
  52.     {
  53.         tree[node]=(end-start+1);
  54.         if(start!=end)
  55.         {
  56.             lazy[2*node]=2;
  57.             lazy[2*node+1]=2;
  58.         }
  59.         lazy[node]=0;
  60.     }
  61.     else if(lazy[node]==1)
  62.     {
  63.         tree[node]=0;
  64.         if(start!=end)
  65.         {
  66.             lazy[2*node]=1;
  67.             lazy[2*node+1]=1;
  68.         }
  69.         lazy[node]=0;  
  70.     }
  71.     if(start>end || l>end || r<start || r<l)
  72.         return;
  73.     if(start>=l && end<=r)
  74.     {
  75.         if(prime[val])
  76.         {
  77.             tree[node]=end-start+1;
  78.             if(start!=end)
  79.             {
  80.                 lazy[2*node]=2;
  81.                 lazy[2*node+1]=2;
  82.             }
  83.             lazy[node]=0;      
  84.         }
  85.         else
  86.         {
  87.             tree[node]=0;
  88.             if(start!=end)
  89.             {
  90.                 lazy[2*node]=1;
  91.                 lazy[2*node+1]=1;
  92.             }
  93.             lazy[node]=0;      
  94.         }
  95.         return;
  96.     }
  97.     ll mid=(start+end)/2;
  98.     update(2*node,start,mid,l,r,val);
  99.     update(2*node+1,mid+1,end,l,r,val);
  100.     tree[node]=tree[2*node]+tree[2*node+1];
  101.     return;
  102. }
  103. ll query(ll node,ll start,ll end,ll l,ll r)
  104. {
  105.     if(lazy[node]==2)
  106.     {
  107.         tree[node]=(end-start+1);
  108.         if(start!=end)
  109.         {
  110.             lazy[2*node]=2;
  111.             lazy[2*node+1]=2;
  112.         }
  113.         lazy[node]=0;
  114.     }
  115.     else if(lazy[node]==1)
  116.     {
  117.         tree[node]=0;
  118.         if(start!=end)
  119.         {
  120.             lazy[2*node]=1;
  121.             lazy[2*node+1]=1;
  122.         }
  123.         lazy[node]=0;  
  124.     }
  125.     if(start>end || l>end || r<start || l>r)
  126.         return 0;
  127.     if(start>=l && end<=r)
  128.     {
  129.         return(tree[node]);
  130.     }
  131.     ll mid=(start+end)/2;
  132.     ll p=query(2*node,start,mid,l,r);
  133.     p+=query(2*node+1,mid+1,end,l,r);
  134.     return(p);
  135. }
  136. int main()
  137. {
  138.     ios_base::sync_with_stdio(false);
  139.     cin.tie(0);
  140.     cout.tie(0);
  141.     ll TESTS=1,temp;
  142.     cin>>TESTS;
  143.     temp=TESTS;
  144.     memset(prime, true, sizeof(prime));
  145.     prime[1]=false;
  146.     for (ll p=2; p*p<=MAXN; p++)
  147.     {
  148.         // If prime[p] is not changed, then it is a prime
  149.         if (prime[p] == true)
  150.         {
  151.             // Update all multiples of p
  152.             for (ll i=p*2; i<=MAXN; i += p)
  153.                 prime[i] = false;
  154.         }
  155.     }
  156.     while(TESTS--)
  157.     {
  158.         cout<<"Case "<<(temp-TESTS)<<":\n";
  159.         ll n,q,t,x,y,z;
  160.         cin>>n>>q;
  161.         rep(i,1,n+1)
  162.         {
  163.             cin>>v[i];
  164.         }
  165.         rep(i,0,4*n)
  166.         lazy[i]=0;
  167.         build(1,1,n);
  168.         rep(i,0,q)
  169.         {
  170.             cin>>t;
  171.             if(t==0)
  172.             {
  173.                 cin>>x>>y>>z;
  174.                 update(1,1,n,x,y,z);
  175.             }
  176.             else
  177.             {
  178.                 cin>>x>>y;
  179.                 cout<<query(1,1,n,x,y)<<endl;
  180.             }
  181.         }
  182.     }
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement