Submission #1347773

#TimeUsernameProblemLanguageResultExecution timeMemory
1347773goodpjw2008Street Lamps (APIO19_street_lamps)C++20
0 / 100
1 ms580 KiB
#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
using pii=pair<int,int>;
struct p{
    int qu,x,y,time,cnt,idx;
}events[1500002];
int anst[300002],ans[300002],evc,n;
set<pii>st;
string s;
struct fen{
    int tree[300002];
    void update(int x, int val){
        while(x<=n){
            tree[x]+=val;
            x+=x&-x;
        }
    }
    int query(int x){
        int ret=0;
        while(x>0){
            ret+=tree[x];
            x-=x&-x;
        }
        return ret;
    }
}sumf,cntf;
void cdq(int l,int r){
    if(l>=r)return;
    int mid=(l+r)/2;
    cdq(l,mid);cdq(mid+1,r);
    vector<p>vl,vr;
    for(int i = l; i <= mid; i++){
        if(events[i].qu==1)vl.push_back(events[i]);
    }
    for(int i = mid+1; i <= r; i++){
        if(events[i].qu==2)vr.push_back(events[i]);
    }
    sort(vl.begin(),vl.end(),[](p &a,p &b){
        return a.x<b.x;
    });
    sort(vr.begin(),vr.end(),[](p &a,p &b){
        return a.x<b.x;
    });
    int idx=0;
    for(auto &i:vr){
        while(idx<vl.size()&&vl[idx].x<=i.x){
            sumf.update(vl[idx].y,vl[idx].time*vl[idx].cnt);
            cntf.update(vl[idx].y,vl[idx].cnt);
            idx++;
        }
        ans[i.idx]+=sumf.query(n)-sumf.query(i.y-1);
        anst[i.idx]+=cntf.query(n)-cntf.query(i.y-1);
    }
    for(int i = 0; i < idx; i++){
        sumf.update(vl[i].y,-vl[i].time*vl[i].cnt);
        cntf.update(vl[i].y,-vl[i].cnt);
    }
}
int qn[300002];
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int q,cur=0,pos,x,y;
    string t;
    cin>>n>>q>>s;
    for(int i = 0; i < n; i++){
        if(s[i]=='1'){
            if(cur==0){
                cur=1;
                pos=i+1;
            }
        }
        else{
            if(cur==1){
                st.insert({pos,i});
                events[evc++]={1,pos,i,0,1,0};
                cur=0;
            }
        }
    }
    if(cur==1){
        st.insert({pos,n});
        events[evc++]={1,pos,n,0,1,0};
    }
    for(int i = 1; i <= q; i++){
        cin>>t;
        if(t=="query"){
            cin>>x>>y;
            y--;
            events[evc++]={2,x,y,0,0,i};
            qn[i]=1;
        }
        else{
            cin>>x;
            if(s[x-1]=='1'){
                s[x-1]='0';
                auto it=st.upper_bound({x,1e9});
                it--;
                int l=it->first,r=it->second;
                st.erase(it);
                events[evc++]={1,l,r,i,-1,0};
                if(l<x){
                    st.insert({l,x-1});
                    events[evc++]={1,l,x-1,i,1,0};
                }
                if(x<r){
                    st.insert({x+1,r});
                    events[evc++]={1,x+1,r,i,1,0};
                }
            }
            else{
                s[x-1]='1';
                auto rgt=st.lower_bound({x,0}),lft=rgt;
                if(rgt!=st.begin())lft--;
                if((lft==st.begin()||lft->second<x-1)&&(rgt==st.end()||rgt->first>x+1)){
                    st.insert({x,x});
                    events[evc++]={1,x,x,i,1,0};
                    continue;
                }
                if(rgt==st.begin()||lft->second<x-1){
                    int l=rgt->first,r=rgt->second;
                    events[evc++]={1,l,r,i,-1,0};
                    st.erase(rgt);
                    st.insert({x,r});
                    events[evc++]={1,x,r,i,1,0};
                    continue;
                }
                if(rgt==st.end()||rgt->first>x+1){
                    int l=lft->first,r=lft->second;
                    events[evc++]={1,l,r,i,-1,0};
                    st.erase(lft);
                    st.insert({l,x});
                    events[evc++]={1,l,x,i,1,0};
                    continue;
                }
                lft--;
                int ll=lft->first,lr=lft->second,rl=rgt->first,rr=rgt->second;
                st.erase(lft);st.erase(rgt);
                events[evc++]={1,ll,lr,i,-1,0};
                events[evc++]={1,rl,rr,i,-1,0};
                st.insert({ll,rr});
                events[evc++]={1,ll,rr,i,1,0};
            }
            qn[i]=0;
        }
    }
    cdq(0,evc-1);
    for(int i = 1; i <= q; i++){
        if(qn[i])cout<<anst[i]*i-ans[i]<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...