Advertisement
Riz1Ahmed

Bit Sieve & BIT/Frenwick Tree Algorithm

Jan 28th, 2020
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. /**Bit Sieve && BIT/Frenwick Tree Algorithm (toph.co/p/easy-prime)**\
  2. Given a N size array & Q query. Every Query 2 type:
  3. 1 l r: print total prime in range[l:r]
  4. 2 p v: update the value of array[p] to v.
  5. Note: 1-Based Indexed.  **/
  6. #include<bits/stdc++.h>
  7. using namespace std;
  8. const int MX=1e7;
  9. /// Bitwise Sieve
  10. int bitPrime[MX/32+5];
  11. bool PrimeNot(int x){ return bitPrime[x/32] & (1<<(x%32));}
  12. bool IsPrime(int x){ return !PrimeNot(x);}
  13. void mark(int x){bitPrime[x/32] |= (1<<(x%32));}
  14. void bitSieve(){
  15.     memset(bitPrime,0,sizeof bitPrime);
  16.     mark(1);
  17.     for (int i=2; i*i<=MX; i++)
  18.         if (IsPrime(i))
  19.             for (int j=i*i; j<=MX; j+=i)
  20.                 mark(j);
  21. }
  22. /// BIT/Frenwick Tree
  23. int tree[MX+5];
  24. void update(int idx,int val,int n){
  25.     while(idx<=n)
  26.         tree[idx]+=val,
  27.         idx+=(idx & -idx);
  28. }
  29. int query(int idx){
  30.     int sum=0;
  31.     while(idx>0)
  32.         sum+=tree[idx],
  33.         idx-=(idx & -idx);
  34.     return sum;
  35. }
  36. int main(){
  37.     bitSieve();
  38.     int n,q,tp,pos,val;
  39.     while (~scanf("%d",&n)){
  40.         int ar[n+5];
  41.         for (int i=1; i<=n; i++){
  42.             scanf("%d",&ar[i]);
  43.             if (IsPrime(ar[i])) update(i,1,n);
  44.         }
  45.         scanf("%d",&q);
  46.         while(q--){
  47.             scanf("%d %d %d",&tp,&pos,&val);
  48.             if (tp==1) //Here pos=l, val=r.
  49.                 printf("%d\n",query(val)-query(pos-1));
  50.             else if (tp==2 && IsPrime(val)!=IsPrime(ar[pos])){
  51.                 ar[pos]=val;
  52.                 IsPrime(ar[pos]) ? update(pos,1,n) : update(pos,-1,n);
  53. }   }   }   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement