surajumang08

GGSPAG

Jan 24th, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7.  
  8. using namespace std;
  9. #define MAX 100001
  10. long segtree[4*MAX];
  11. bool primes[MAX],input[MAX];
  12. //use the sieve to store all the primes till MAX.
  13. //primes are marked as zero.
  14. void sieve()
  15. {
  16.   memset(primes,1,sizeof(primes));
  17.   for(int i=2;i<sqrt(MAX);i++)
  18.   {
  19.     if(!primes[i]) continue;
  20.       for(int j=i*2;j<MAX;j+=i)
  21.         primes[j]=0;
  22.   }
  23.   primes[1]=0;
  24.  
  25. }
  26.  
  27. //build the segemnt tree
  28. void build(int node,int st,int en)
  29. {
  30.   if(st==en)
  31.   {
  32.     segtree[node]=input[st];
  33.     return;
  34.   }
  35.   int mid=(st+en)/2;
  36.  
  37.   build(node*2,st,mid);
  38.   build(node*2+1,mid+1,en);
  39.   segtree[node]=segtree[node*2]+segtree[node*2+1];
  40.  
  41. }
  42.  
  43. //update the segment tree (point update)
  44. void update(int node,int st,int en,int index)
  45. {
  46.   if(index>en || index<st)
  47.     return;
  48.   if(st==en && st==index)
  49.   {
  50.     segtree[node]=input[index];
  51.     return;
  52.   }
  53.   int mid=(st+en)/2;
  54.   update(node*2,st,mid,index);
  55.   update(node*2+1,mid+1,en,index);
  56.   segtree[node]=segtree[node*2]+segtree[node*2+1];
  57. }
  58.  
  59. //query the segment tree for prime numbers.
  60. long query(int node,int st,int en,int qs,int qe)
  61. {
  62.   //cout<<"Q("<<node<<" "<<st<<" "<<en<<")"<<endl;
  63.   if(qs > en || qe < st)//completely outside
  64.    return 0;
  65.   if(qs <= st && qe >= en)//completely inside
  66.     return segtree[node];
  67. int mid=(st+en)/2;
  68.   return query(node*2,st,mid,qs,qe)+ query(node*2+1,mid+1,en,qs,qe);
  69.  
  70. }
  71.  
  72. int main()
  73. {
  74.   sieve();
  75.  
  76.   long n,q;
  77.   long long num,j=0;
  78.   cin>>n>>q;
  79.  
  80.   for(int i=1;i<=n;i++)
  81.   {
  82.     scanf("%d",&num);
  83.     (primes[num]) ? input[i]=1 : input[i]=0;
  84.  
  85.  
  86.   }
  87.   build(1,1,n);
  88.   long type,X,Y;
  89.   while(q--)
  90.   {
  91.     cin>>type>>X>>Y;
  92.     if(type==1)//query
  93.     {
  94.  
  95.         cout<<query(1,1,n,X,Y)<<endl;
  96.     }
  97.     else
  98.     {
  99.       (primes[Y])? input[X]=1 : input[X]=0;
  100.         update(1,1,n,X);
  101.     }
  102.   }
  103.  
  104.  
  105. }
Add Comment
Please, Sign In to add comment