Submission #1351465

#TimeUsernameProblemLanguageResultExecution timeMemory
1351465nguyenkhangninh99Street Lamps (APIO19_street_lamps)C++20
100 / 100
454 ms59632 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 3e5 + 5;
int bit[maxn], ans[maxn], ok[maxn];
void add(int p, int v){
    for (; p < maxn; p += p & -p) bit[p] += v;
}
int get(int p){
    int res = 0;
    for (; p; p -= p & -p) res += bit[p];
    return res;
}
struct node{
    int x, y, val, id;
};
vector<node> qry, tmp;

void cdq(int l, int r) {
    int mid = (l + r) / 2;
    if(l < mid) cdq(l, mid);
    if(mid + 1 < r) cdq(mid + 1, r);

    int i = l, j = mid + 1, k = l;
    while(i <= mid && j <= r){
        if(qry[i].x <= qry[j].x){
            if(qry[i].id == 1) add(qry[i].y, qry[i].val);
            tmp[k++] = qry[i++];
        }else{
            if(qry[j].id < 0) ans[-qry[j].id] += get(maxn - 1) - get(qry[j].y - 1);
            tmp[k++] = qry[j++];
        }
    }
    while(i <= mid){
        if(qry[i].id == 1) add(qry[i].y, qry[i].val);
        tmp[k++] = qry[i++];
    }
    while(j <= r) {
        if(qry[j].id < 0) ans[-qry[j].id] += get(maxn - 1) - get(qry[j].y - 1);
        tmp[k++] = qry[j++];
    }
    for(int p = l; p <= mid; p++) if(qry[p].id == 1) add(qry[p].y, -qry[p].val);
    for(int p = l; p <= r; p++) qry[p] = tmp[p];
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, q; cin >> n >> q;
    string t; cin >> t;

    set<int> s;
    s.insert(0);
    s.insert(n + 1);
    for(int i = 1; i <= n; i++){
        if(t[i - 1] == '0') s.insert(i);
    }

    int last = 0;
    for(int x: s){
        if(x - last > 1) qry.push_back({last + 1, x - 1, -0, 1}); //các đoạn liên tiếp số 1
        last = x;
    }

    for(int i = 1; i <= q; i++){
        string type; cin >> type;
        if(type == "toggle"){
            int x; cin >> x;
            if(t[x - 1] == '0'){
                t[x - 1] = '1';
                auto it = s.find(x);
                int l = *prev(it), r = *next(it);
                
                if(x - l > 1) qry.push_back({l + 1, x - 1, i, 1});
                if(r - x > 1) qry.push_back({x + 1, r - 1, i, 1});
                qry.push_back({l + 1, r - 1, -i, 1});
                s.erase(it);
            }else{
                t[x - 1] = '0';
                s.insert(x);
                auto it = s.find(x);
                int l = *prev(it), r = *next(it);
                
                qry.push_back({l + 1, r - 1, i, 1});
                if(x - l > 1) qry.push_back({l + 1, x - 1, -i, 1});
                if(r - x > 1) qry.push_back({x + 1, r - 1, -i, 1});
            }
        }else{
            int a, b; cin >> a >> b;
            if(*s.lower_bound(a) > b - 1) ans[i] += i;
            qry.push_back({a, b - 1, 0, -i});
            ok[i] = 1;
        }
    }

    tmp.resize(qry.size());
    cdq(0, qry.size() - 1);

    for(int i = 1; i <= q; i++){
        if(ok[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...