Guest User

Untitled

a guest
Nov 6th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N = 100009;
  5. struct node{
  6.   ll maxps;
  7.   ll maxss;
  8.   ll tot;
  9.   ll maxsubs;
  10.   node(){
  11.     maxsubs=INT_MIN;
  12.     maxps=INT_MIN;
  13.     maxss=INT_MIN;
  14.     tot=INT_MIN;
  15.   }};
  16. ll arr[N]={0};
  17. ll b[N];
  18. node seg[4*N];
  19.  
  20. node res(node left,node right){
  21.     node parent;
  22.     parent.maxps=max(left.maxps,left.tot+right.maxps);
  23.     parent.maxss=max(left.maxss+right.tot,right.maxss);
  24.     parent.tot=left.tot+right.tot;
  25.     parent.maxsubs=max(left.maxsubs,max(right.maxsubs,left.maxss+right.maxps));
  26.     return parent;
  27. }
  28. void update(int start,int end,int x,int indx){
  29.     if(start==end){
  30.         seg[x].tot=b[start];
  31.         seg[x].maxps=b[start];
  32.         seg[x].maxss=b[start];
  33.         seg[x].maxsubs=b[start];
  34.  
  35.     }
  36.     else{
  37.         int mid=(start+end)/2;
  38.         int left=2*x;
  39.         int right=2*x+1;
  40.         if(indx<=mid)
  41.           update(start,mid,left,indx);
  42.         else update(mid+1,end,right,indx);
  43.        
  44.         seg[x]=res(seg[left],seg[right]);
  45.     }
  46. }
  47.  
  48. node query(int start,int end,int x,int l,int r){
  49.   if( l<=start && r>=end){
  50.     //  cout<<seg[x].maxsubs;
  51.     return seg[x];
  52.   }
  53.   else if(l>end || r<start){
  54.     node nulln;
  55.    // cout<<nulln.maxsubs;
  56.     return nulln;
  57.   }
  58.   else{
  59.     int left = 2*x;
  60.     int right = 2*x+1;
  61.     int mid=(start+end)/2;
  62.     node p1 = query(start,mid,left,l,r);
  63.     node p2 = query(mid+1,end,right,l,r);
  64.     node p=res(p1,p2);
  65.    // cout<<p.maxss;
  66.     return p;
  67.   }
  68. }
  69. int main()
  70. {
  71.     /*#ifndef ONLINE_JUDGE
  72.     freopen("in04.txt","r",stdin);
  73.     freopen("out04.txt","w",stdout);
  74.     #endif*/
  75.     map<ll,int>mp;
  76.     for (int i=0;i<=60;i++) {
  77.         for (int j=i;j<=60;j++) {
  78.             for (int k=j;k<=60;k++) {
  79.  
  80.                 if(i!=j && i!=k && j!=k){
  81.                     ll x =(1ll<<i)+(1ll<<j)+(1ll<<k);
  82.                     mp[x]=1;
  83.                 }
  84.             }
  85.         }
  86.     }
  87.     int n,q;
  88.     cin>>n>>q;
  89.     //cout<<INT_MIN;
  90.     for(int i=0;i<n;i++) b[i]=INT_MIN;
  91.     for(int i=0;i<q;i++){
  92.         int type;
  93.         cin>>type;
  94.         if(type==1){
  95.             int x,l;
  96.             cin>>x>>l;
  97.             ll z=pow(2,l);
  98.             arr[x-1]=arr[x-1]^z;
  99.             if(mp[arr[x-1]]==1){
  100.                 b[x-1]=1;
  101.             }
  102.             else b[x-1]=INT_MIN;
  103.             update(0,n-1,1,x-1);
  104.         }
  105.         else{
  106.             int l,r;
  107.             cin>>l>>r;
  108.             node x=query(0,n-1,1,l-1,r-1);
  109.             //if(x==) cout<<"0\n";
  110.             ll ans=x.maxsubs;
  111.             if(ans<0) ans=0;
  112.              cout<<ans<<"\n";
  113.             // cout<<seg[1].maxsubs;
  114.         }
  115.     }
  116.    
  117.     return 0;
  118. }
Add Comment
Please, Sign In to add comment