Advertisement
Guest User

Untitled

a guest
Jun 5th, 2020
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. int evencount[400004];
  6. bool A[100001];
  7. int num;
  8. int buildCnt=0, updateCnt=0, queryCnt=0;
  9. void assert_re(bool q) {
  10.     while (!q) {
  11.         throw 1;
  12.     }
  13. }
  14. void assert_tle(bool q) {
  15.     // intinity loop
  16.     while (!q);
  17. }
  18.  
  19. void assert_mle(bool q) {
  20.     static int * arr;
  21.     while (!q) {
  22.         arr = new int[256];
  23.     }
  24. }
  25.  
  26. void build(int node,int start,int end,int depth=0)
  27. {
  28.     buildCnt++;
  29.     assert(buildCnt <= (int)1e7);
  30.     assert_re(depth <= 20);
  31.     if(start+1==end)
  32.     {
  33.         evencount[node]=(A[start]%2==0);
  34.         return;
  35.     }
  36.     int mid=start+(end-start)/2;
  37.     build(2*node+1,start,mid,depth+1);
  38.     build(2*node+2,mid+1,end,depth+1);
  39.     int left=2*node+1;
  40.     int right=2*node+2;
  41.     evencount[node]=evencount[left]+evencount[right];
  42. }
  43.  
  44. void update(int node,int start,int end,int idx,int val,int depth=0)
  45. {
  46.     updateCnt++;
  47.     assert(updateCnt <= (int)1e7);
  48.     assert_tle(depth <= 20);
  49.     if(start+1==end)
  50.     {
  51.         A[idx]=val%2;
  52.         evencount[node]=(val%2==0);
  53.         return;
  54.     }
  55.     int mid=start+(end-start)/2;
  56.     if(idx <= mid)
  57.     {
  58.         update(2*node+1,start,mid,idx,val,depth+1);
  59.     }
  60.     else{
  61.         update(2*node+2,mid+1,end,idx,val,depth+1);
  62.     }
  63.     int left=2*node+1;
  64.     int right=2*node+2;
  65.     evencount[node]=evencount[left]+evencount[right];
  66. }
  67.  
  68. int query(int node,int start,int end,int left,int right,int depth=0)
  69. {
  70.     queryCnt++;
  71.     assert(queryCnt <= (int)1e7);
  72.     assert_mle(depth <= 20);
  73.     if(end < left || start > right)
  74.     {
  75.         return 0;
  76.     }
  77.     if(left<=start && end>=right)
  78.     return evencount[node];
  79.  
  80.     int mid=start+(end-start)/2;
  81.     int p1,p2;
  82.     p1=query(2*node+1,start,mid,left,right,depth+1);
  83.     p2=query(2*node+2,mid+1,end,left,right,depth+1);
  84.     return p1+p2;
  85. }
  86.  
  87.  
  88. int main(){
  89.     int N;
  90.     cin>>N;
  91.     for(int i=0;i<N;i++)
  92.     {
  93.         cin>>num;
  94.         A[i]=num%2;
  95.     }
  96.     int Q;
  97.     cin>>Q;
  98.     for(int i=0;i<Q;i++)
  99.     {
  100.         int q,a,b;
  101.         cin>>q>>a>>b;
  102.         if(q==0)
  103.             update(0,0,N,a-1,b);
  104.         else
  105.         {
  106.             int t=query(0,0,N,a-1,b-1);
  107.             if(q==1)
  108.             cout<<t<<endl;
  109.             else
  110.             cout<<(b-a+1)-t<<endl;
  111.         }
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement