Submission #1353766

#TimeUsernameProblemLanguageResultExecution timeMemory
1353766srividya_06Street Lamps (APIO19_street_lamps)C++20
100 / 100
542 ms108392 KiB
#include <bits/stdc++.h>
#define int long long
#define REP(i,a,b) for(int i = a; i<b; i++)
#define RREP(i,a,b) for(int i = a; i>b; i--)
#define pb push_back
using namespace std;
int n,q;
vector<int> tree,ans;
vector<bool> out;
void update(int i, int val){
    for(; i<=n; i+=i&-i){
        tree[i]+=val;
    }
}
int query(int i){
    int res = 0;
    for(; i>0; i-=i&-i){
        res+=tree[i];
    }
    return res;
}
struct node{
    int x,y,val,id;
};
int INF = 1e18;
vector<node> qry;
vector<node> cdq(int l, int r){
    if(l == r) return {qry[l]};
    vector<node> curr1 = cdq(l, (l+r)/2);
    vector<node> curr2 = cdq((l+r)/2+1, r);
    vector<node> z;
    int i = 0, j = 0;
    while(i<curr1.size() && j<curr2.size()){
        if(curr1[i].x <= curr2[j].x){
            if(curr1[i].id == 1) update(curr1[i].y, curr1[i].val); 
            z.push_back(curr1[i]);
            i++;
        }
        else{
            if(curr2[j].id < 0) ans[-curr2[j].id] += query(n) - query(curr2[j].y-1);
            z.push_back(curr2[j]);
            j++;
        }
    }
    while(i < curr1.size()){
        if(curr1[i].id == 1) update(curr1[i].y, curr1[i].val); 
        z.push_back(curr1[i]);
        i++;
    }
    while(j < curr2.size()){
        if(curr2[j].id < 0) ans[-curr2[j].id] += query(n) - query(curr2[j].y-1);
        z.push_back(curr2[j]);
        j++;
    }
    REP(i,0,curr1.size()) if(curr1[i].id == 1) update(curr1[i].y, -curr1[i].val);
    return z;
}
int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>q;
    ans.resize(q+1);
    out.resize(q+1);
    tree.resize(n+1,0);
    string curr;
    cin>>curr;
    set<int> s;
    s.insert(0);
    REP(i,0,n){
        if(curr[i] == '0') s.insert(i + 1);
    }
    s.insert(n+1);
    int lst = 0,nxt;
    for(int i: s){
        if(lst+1<i) qry.pb({lst+1, i-1, 0, 1});
        lst = i;
    }
    REP(j,1,q+1){
        string type;
        cin>>type;
        if(type == "toggle"){
            int i;
            cin>>i;
            if(curr[i-1] == '1'){
                curr[i-1] = '0';
                s.insert(i);
                auto it = s.find(i);
                lst = *prev(it);
                nxt = *next(it);
                qry.pb({lst+1,nxt-1,j,1});
                if(lst<i-1) qry.pb({lst+1,i-1,-j,1});
                if(i+1<nxt) qry.pb({i+1,nxt-1,-j,1});
            }
            else{
                curr[i-1] = '1';
                auto it = s.find(i);
                lst = *prev(it);
                nxt = *next(it);
                if(lst<i-1)qry.pb({lst+1,i-1,j,1});
                if(i+1<nxt)qry.pb({i+1,nxt-1,j,1});
                qry.pb({lst+1,nxt-1,-j,1});
                s.erase(it);
            }
        }
        else{
            int a,b;
            cin>>a>>b;
            if(*s.lower_bound(a)>b-1) ans[j] = j;
            qry.pb({a, b-1, 0, -j});
            out[j] = true;
        }
    }
    cdq(0,qry.size()-1);
    REP(i,1,q+1) if(out[i]) cout<<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...