Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- const int N = 100009;
- struct node{
- ll maxps;
- ll maxss;
- ll tot;
- ll maxsubs;
- node(){
- maxsubs=INT_MIN;
- maxps=INT_MIN;
- maxss=INT_MIN;
- tot=INT_MIN;
- }};
- ll arr[N]={0};
- ll b[N];
- node seg[4*N];
- node res(node left,node right){
- node parent;
- parent.maxps=max(left.maxps,left.tot+right.maxps);
- parent.maxss=max(left.maxss+right.tot,right.maxss);
- parent.tot=left.tot+right.tot;
- parent.maxsubs=max(left.maxsubs,max(right.maxsubs,left.maxss+right.maxps));
- return parent;
- }
- void update(int start,int end,int x,int indx){
- if(start==end){
- seg[x].tot=b[start];
- seg[x].maxps=b[start];
- seg[x].maxss=b[start];
- seg[x].maxsubs=b[start];
- }
- else{
- int mid=(start+end)/2;
- int left=2*x;
- int right=2*x+1;
- if(indx<=mid)
- update(start,mid,left,indx);
- else update(mid+1,end,right,indx);
- seg[x]=res(seg[left],seg[right]);
- }
- }
- node query(int start,int end,int x,int l,int r){
- if( l<=start && r>=end){
- // cout<<seg[x].maxsubs;
- return seg[x];
- }
- else if(l>end || r<start){
- node nulln;
- // cout<<nulln.maxsubs;
- return nulln;
- }
- else{
- int left = 2*x;
- int right = 2*x+1;
- int mid=(start+end)/2;
- node p1 = query(start,mid,left,l,r);
- node p2 = query(mid+1,end,right,l,r);
- node p=res(p1,p2);
- // cout<<p.maxss;
- return p;
- }
- }
- int main()
- {
- /*#ifndef ONLINE_JUDGE
- freopen("in04.txt","r",stdin);
- freopen("out04.txt","w",stdout);
- #endif*/
- map<ll,int>mp;
- for (int i=0;i<=60;i++) {
- for (int j=i;j<=60;j++) {
- for (int k=j;k<=60;k++) {
- if(i!=j && i!=k && j!=k){
- ll x =(1ll<<i)+(1ll<<j)+(1ll<<k);
- mp[x]=1;
- }
- }
- }
- }
- int n,q;
- cin>>n>>q;
- //cout<<INT_MIN;
- for(int i=0;i<n;i++) b[i]=INT_MIN;
- for(int i=0;i<q;i++){
- int type;
- cin>>type;
- if(type==1){
- int x,l;
- cin>>x>>l;
- ll z=pow(2,l);
- arr[x-1]=arr[x-1]^z;
- if(mp[arr[x-1]]==1){
- b[x-1]=1;
- }
- else b[x-1]=INT_MIN;
- update(0,n-1,1,x-1);
- }
- else{
- int l,r;
- cin>>l>>r;
- node x=query(0,n-1,1,l-1,r-1);
- //if(x==) cout<<"0\n";
- ll ans=x.maxsubs;
- if(ans<0) ans=0;
- cout<<ans<<"\n";
- // cout<<seg[1].maxsubs;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment