Guest User

Untitled

a guest
Nov 6th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define n 100000
  3. using namespace std;
  4. typedef long long int in;
  5. in a[n+1],c[n+1],t[(4*n)+4]; // c- checker array - c[i]=1 if 'i' got 3 set bits
  6.  
  7. void update(in x, in s, in e, in l, in r)
  8. {
  9.     in tem;
  10.     if(s==e) {
  11.         a[l]=r;
  12.         tem=__builtin_popcountll(r);
  13.         if(tem==3)
  14.             t[x]=c[l]=1;
  15.         else {
  16.             if(c[l]==1)
  17.                 c[l]=t[x]=0;
  18.         }
  19.         return;
  20.     }
  21.     in mid=(s+e)/2;
  22.     in p=(2*x);
  23.     in q=p+1;
  24.     if(s<=l && l<=mid)
  25.         update(p,s,mid,l,r);
  26.     else
  27.         update(q,mid+1,e,l,r);
  28.    
  29.     if(c[mid]==c[mid+1] && c[mid]==1)
  30.         t[x]=t[p]+t[q];
  31.     else
  32.         t[x]=max(t[p],t[q]);
  33.     return;
  34. }
  35. in query(in x, in s, in e, in l, in r) //completely fine
  36. {
  37.     if(s>r || e<l)
  38.         return 0;
  39.     if(l<=s && e<=r)
  40.         return t[x];
  41.    
  42.     in mid,p,q,lt,rt; //lt-left, rt-right
  43.     mid =(s+e)/2;
  44.     p=(2*x); q=p+1;
  45.     lt=query(p,s,mid,l,r);
  46.     rt=query(q,mid+1,e,l,r);
  47.     if(c[mid]==c[mid+1] && c[mid]==1)
  48.         return lt+rt;
  49.     else
  50.         return max(lt,rt);
  51. }
  52.  
  53. int main()
  54. {
  55.     in m,q,x,i,t1,l,r;
  56.     scanf("%lld %lld", &m, &q);
  57.     assert(1<=m && m<=100000);
  58.     assert(1<=q && q<=100000);
  59.     //no build function reqd since initial value zero
  60.     while(q--) {
  61.         scanf("%lld %lld %lld", &x, &l, &r);
  62.         assert(1<=x && x<=2);
  63.         if(x==1) {
  64.             assert(1<=l && l<=m);
  65.             assert(1<=r && r<=62); //2 power 63 exceeds long long range
  66.             t1=(a[l-1]^((1LL)<<(r-1)));
  67.             update(1,0,m-1,l-1,t1);
  68.         }
  69.         else {
  70.             assert(1<=r && r<=m);
  71.             assert(1<=l && l<=r);
  72.             t1=query(1,0,m-1,l-1,r-1);
  73.             cout<<t1<<"\n";
  74.         }
  75.     }
  76.     return 0;
  77. }
Add Comment
Please, Sign In to add comment