#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
const int N = 3e5+5;
int n,q,bits[2][N],val[N],ans[N];
string s;
vector<int>qr;
struct events{
int id,l,r,t;
};
vector<events>loj;
bool cmp(events a, events b){
return a.t < b.t;
}
bool cmp1(events a, events b){
return a.r > b.r;
}
void update(int id, int u, int val){
while(u <= n){
bits[id][u] += val;
u += u & (-u);
}
}
int get(int id, int u){
int sum = 0;
while(u > 0){
sum += bits[id][u];
u -= u & (-u);
}
return sum;
}
set<int>st;
int cnp(int u){
int l = 0;
int r = loj.size()-1;
int ans;
while(l <= r){
int mid = (l+r)/2;
if(loj[mid].t >= u){
ans = mid;
r = mid-1;
}
else l = mid+1;
}
return ans;
}
void dnc(int l, int r){
if(l == r) return;
int mid = (l+r)/2;
dnc(l,mid);
dnc(mid+1,r);
int l1 = cnp(l);
int r1 = cnp(mid+1)-1;
int l2 = r1+1;
int r2 = cnp(r+1)-1;
vector<events>diddy1,diddy2;
for(int i = l1; i <= r1; i++){
if(loj[i].id != 0) diddy1.push_back(loj[i]);
}
for(int i = l2; i <= r2; i++){
if(loj[i].id == 0) diddy2.push_back(loj[i]);
}
sort(diddy1.begin(),diddy1.end(),cmp1);
sort(diddy2.begin(),diddy2.end(),cmp1);
int ptr = 0;
for(auto[id,l3,r3,t]: diddy2){
while(ptr < diddy1.size() && diddy1[ptr].r >= r3){
auto[id1,l4,r4,t1] = diddy1[ptr];
update(0,l4,id1);
update(1,l4,t1*id1);
ptr++;
}
ans[t] += get(0,l3)*t-get(1,l3);
//cout << l << " " << mid << " " << r << " " << t << " " << ans[t] << "\n";
}
for(int i = ptr-1; i >= 0; i--){
auto[id,l3,r3,t] = diddy1[i];
update(0,l3,-id);
update(1,l3,-t*id);
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> q >> s;
s = "#"+s;
for(int i = 1; i <= n; i++){
if(s[i] == '0') st.insert(i);
}
st.insert(0);
st.insert(n+1);
for(int i = 1; i <= q; i++){
string type;
cin >> type;
if(type == "toggle"){
int u;
cin >> u;
if(s[u] == '0'){
auto y = st.upper_bound(u);
auto x = st.lower_bound(u);
--x;
int l = *x;
int r = *y;
if(l < u-1){
int dm = max(val[l],val[u]);
loj.push_back({1,l+1,u,dm});
loj.push_back({-1,l+1,u,i});
}
if(u < r-1){
int dm = max(val[r],val[u]);
loj.push_back({1,u+1,r,dm});
loj.push_back({-1,u+1,r,i});
}
val[l] = val[r] = i;
st.erase(u);
s[u] = '1';
}
else{
auto y = st.upper_bound(u);
auto x = st.lower_bound(u);
--x;
int l = *x;
int r = *y;
int dm = max(val[l],val[u]);
loj.push_back({1,l+1,r,dm});
loj.push_back({-1,l+1,r,i});
val[u] = val[l] = val[r] = i;
st.insert(u);
s[u] = '0';
}
}
else{
int l,r;
cin >> l >> r;
loj.push_back({0,l,r,i});
qr.push_back(i);
}
}
vector<int>v;
auto l = st.begin();
while(l != st.end()){
v.push_back(*l);
++l;
}
for(int i = 1; i < v.size(); i++){
if(v[i-1] == v[i]-1) continue;
int dm = max(val[v[i]],val[v[i-1]]);
loj.push_back({1,v[i-1]+1,v[i],dm});
loj.push_back({-1,v[i-1]+1,v[i],q+1});
}
sort(loj.begin(),loj.end(),cmp);
//for(auto it: v) cout << it << " ";
//for(auto[id,l,r,t]: loj) cout << id << " " << l << " " << r << " " << t << "\n";
dnc(0,q);
for(auto it: qr) cout << ans[it] << "\n";
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |