//#pragma GCC optimize("Ofast,unroll-loops,O3")
//#pragma GCC optimize("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma,tune=native")
#include<bits/stdc++.h>
//#include<bits/extc++.h>
//#pragma pack(1)
#define fast ios::sync_with_stdio(0); cin.tie(0);
#define int long long
#define pii pair<int,int>
#define x first
#define y second
#define N 300015
using namespace std;
//using namespace __gnu_pbds;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//typedef tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> order_multiset;
//typedef tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> order_set;
struct BIT{
int n;
vector<int>arr;
vector<int>have;
void in(int x){ have.push_back(x); }
void build(){
sort(have.begin(),have.end());
have.resize(unique(have.begin(),have.end())-have.begin());
n=have.size();
arr.resize(n+3);
}
int idx(int x){
if (have.empty()) return 0;
return upper_bound(have.begin(),have.end(),x)-have.begin();
}
void modify(int p,int c){
if (p==0) return;
for (;p<=n;p+=(p&-p))
arr[p]+=c;
}
int query(int p){
int ans=0;
for (;p>0;p-=(p&-p))
ans+=arr[p];
return ans;
}
};
struct BBIT{
int n;
vector<BIT>arr;
void init(int _n){
n=_n;
arr.resize(n+3);
}
void need_use(int a,int b){
for (;a<=n;a+=(a&-a))
arr[a].in(b);
}
void modify(int a,int b,int c){
for (;a<=n;a+=(a&-a))
arr[a].modify(arr[a].idx(b),c);
}
int query(int a,int b){
int ans=0;
for (;a>0;a-=(a&-a))
ans=(ans+arr[a].query(arr[a].idx(b)));
return ans;
}
}bit;
struct Query{
int op,a,b;
Query(int i,int j,int k):op(i),a(j),b(k){}
};
int n,q,last_time[N];
bool arr[N];
set<pair<pii,int> >all;
vector<Query>qry;
vector<pair<pii,int> >change[N];
void add_need(int a,int b){
if (a>b) return;
bit.need_use(a,a); bit.need_use(a,b+1);
bit.need_use(b+1,a); bit.need_use(b+1,b+1);
}
signed main(){
fast
cin>>n>>q;
bit.init(n);
int l=1,val=-1;
for (int i=1;i<=n;i++){
char c; cin>>c;
arr[i]=c-'0';
if (arr[i]==val) continue;
else {
if (val==1) all.insert({{l,i-1},0});
val=arr[i]; l=i;
}
}
if (val==1)
all.insert({{l,n},0});
for (int i=1;i<=q;i++){
string str;
int a=0,b=0; cin>>str;
if (str=="toggle"){
cin>>a;
qry.push_back(Query(1,a,a));
}
else {
cin>>a>>b; b--;
qry.push_back(Query(2,a,b));
bit.need_use(a,b);
}
}
for (int i=1;i<=q;i++){
if (qry[i-1].op==1){
int p=qry[i-1].a;
if (arr[p]==1){
auto it=all.upper_bound(pair<pii,int>(pii(p,1e9),1e9)); it--;
auto [j,t]=(*it);
change[i].push_back({{j.x,j.y},i-t});
add_need(j.x,j.y);
all.erase(it);
if (j.x<=p-1) all.insert({{j.x,p-1},i});
if (p+1<=j.y) all.insert({{p+1,j.y},i});
}
else {
auto it=all.upper_bound(pair<pii,int>(pii(p,p),1e9));
pii now={p,p};
if (it!=all.end()){
if ((*it).x.x==p+1){
now.y=(*it).x.y;
change[i].push_back({(*it).x,i-(*it).y});
add_need((*it).x.x,(*it).x.y);
it=all.erase(it);
}
}
if (it!=all.begin()){
it=prev(it);
if ((*it).x.y==p-1){
now.x=(*it).x.x;
change[i].push_back({(*it).x,i-(*it).y});
add_need((*it).x.x,(*it).x.y);
it=all.erase(it);
}
}
all.insert({now,i});
}
arr[p]^=1;
}
else {
int a=qry[i-1].a,b=qry[i-1].b;
auto it=all.upper_bound(pair<pii,int>(pii(a,1e9),1e9));
if (it==all.begin()){
last_time[i]=i;
continue;
}
it--;
if ((*it).x.x<=a&&(*it).x.y>=b) last_time[i]=(*it).y;
else last_time[i]=i;
}
}
for (int i=0;i<=n+1;i++)
bit.arr[i].build();
for (int i=1;i<=q;i++){
if (qry[i-1].op==1){
for (auto [j,t]:change[i]){
// cout<<"change "<<j.x<<' '<<j.y<<" "<<t<<'\n';
bit.modify(j.x,j.x,t);
bit.modify(j.x,j.y+1,-t);
bit.modify(j.y+1,j.x,-t);
bit.modify(j.y+1,j.y+1,t);
}
}
else {
cout<<bit.query(qry[i-1].a,qry[i-1].b)+i-last_time[i]<<'\n';
}
}
}
/*
5 7
11111
query 1 2
toggle 4
query 1 6
query 3 4
toggle 3
query 3 4
query 1 6
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
4 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Correct |
4 ms |
7380 KB |
Output is correct |
6 |
Correct |
4 ms |
7380 KB |
Output is correct |
7 |
Correct |
5 ms |
7380 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
346 ms |
45332 KB |
Output is correct |
2 |
Correct |
471 ms |
62772 KB |
Output is correct |
3 |
Correct |
787 ms |
82652 KB |
Output is correct |
4 |
Correct |
1964 ms |
160852 KB |
Output is correct |
5 |
Correct |
2501 ms |
172832 KB |
Output is correct |
6 |
Correct |
2174 ms |
166436 KB |
Output is correct |
7 |
Correct |
780 ms |
97744 KB |
Output is correct |
8 |
Correct |
784 ms |
99608 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
7764 KB |
Output is correct |
2 |
Correct |
7 ms |
7792 KB |
Output is correct |
3 |
Correct |
6 ms |
7764 KB |
Output is correct |
4 |
Correct |
5 ms |
7508 KB |
Output is correct |
5 |
Correct |
2775 ms |
212516 KB |
Output is correct |
6 |
Correct |
3062 ms |
205552 KB |
Output is correct |
7 |
Correct |
2590 ms |
175384 KB |
Output is correct |
8 |
Correct |
1130 ms |
101628 KB |
Output is correct |
9 |
Correct |
134 ms |
25904 KB |
Output is correct |
10 |
Correct |
147 ms |
33840 KB |
Output is correct |
11 |
Correct |
179 ms |
34944 KB |
Output is correct |
12 |
Correct |
1098 ms |
105932 KB |
Output is correct |
13 |
Correct |
1122 ms |
107368 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
7568 KB |
Output is correct |
2 |
Correct |
5 ms |
7636 KB |
Output is correct |
3 |
Correct |
6 ms |
7764 KB |
Output is correct |
4 |
Correct |
8 ms |
7828 KB |
Output is correct |
5 |
Correct |
1225 ms |
105940 KB |
Output is correct |
6 |
Correct |
1687 ms |
138092 KB |
Output is correct |
7 |
Correct |
2218 ms |
165656 KB |
Output is correct |
8 |
Correct |
2798 ms |
195848 KB |
Output is correct |
9 |
Correct |
576 ms |
70832 KB |
Output is correct |
10 |
Correct |
435 ms |
65660 KB |
Output is correct |
11 |
Correct |
559 ms |
74404 KB |
Output is correct |
12 |
Correct |
494 ms |
68900 KB |
Output is correct |
13 |
Correct |
616 ms |
74048 KB |
Output is correct |
14 |
Correct |
467 ms |
67360 KB |
Output is correct |
15 |
Correct |
1082 ms |
105868 KB |
Output is correct |
16 |
Correct |
1061 ms |
107448 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
4 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Correct |
4 ms |
7380 KB |
Output is correct |
6 |
Correct |
4 ms |
7380 KB |
Output is correct |
7 |
Correct |
5 ms |
7380 KB |
Output is correct |
8 |
Correct |
346 ms |
45332 KB |
Output is correct |
9 |
Correct |
471 ms |
62772 KB |
Output is correct |
10 |
Correct |
787 ms |
82652 KB |
Output is correct |
11 |
Correct |
1964 ms |
160852 KB |
Output is correct |
12 |
Correct |
2501 ms |
172832 KB |
Output is correct |
13 |
Correct |
2174 ms |
166436 KB |
Output is correct |
14 |
Correct |
780 ms |
97744 KB |
Output is correct |
15 |
Correct |
784 ms |
99608 KB |
Output is correct |
16 |
Correct |
7 ms |
7764 KB |
Output is correct |
17 |
Correct |
7 ms |
7792 KB |
Output is correct |
18 |
Correct |
6 ms |
7764 KB |
Output is correct |
19 |
Correct |
5 ms |
7508 KB |
Output is correct |
20 |
Correct |
2775 ms |
212516 KB |
Output is correct |
21 |
Correct |
3062 ms |
205552 KB |
Output is correct |
22 |
Correct |
2590 ms |
175384 KB |
Output is correct |
23 |
Correct |
1130 ms |
101628 KB |
Output is correct |
24 |
Correct |
134 ms |
25904 KB |
Output is correct |
25 |
Correct |
147 ms |
33840 KB |
Output is correct |
26 |
Correct |
179 ms |
34944 KB |
Output is correct |
27 |
Correct |
1098 ms |
105932 KB |
Output is correct |
28 |
Correct |
1122 ms |
107368 KB |
Output is correct |
29 |
Correct |
6 ms |
7568 KB |
Output is correct |
30 |
Correct |
5 ms |
7636 KB |
Output is correct |
31 |
Correct |
6 ms |
7764 KB |
Output is correct |
32 |
Correct |
8 ms |
7828 KB |
Output is correct |
33 |
Correct |
1225 ms |
105940 KB |
Output is correct |
34 |
Correct |
1687 ms |
138092 KB |
Output is correct |
35 |
Correct |
2218 ms |
165656 KB |
Output is correct |
36 |
Correct |
2798 ms |
195848 KB |
Output is correct |
37 |
Correct |
576 ms |
70832 KB |
Output is correct |
38 |
Correct |
435 ms |
65660 KB |
Output is correct |
39 |
Correct |
559 ms |
74404 KB |
Output is correct |
40 |
Correct |
494 ms |
68900 KB |
Output is correct |
41 |
Correct |
616 ms |
74048 KB |
Output is correct |
42 |
Correct |
467 ms |
67360 KB |
Output is correct |
43 |
Correct |
1082 ms |
105868 KB |
Output is correct |
44 |
Correct |
1061 ms |
107448 KB |
Output is correct |
45 |
Correct |
154 ms |
29300 KB |
Output is correct |
46 |
Correct |
254 ms |
38556 KB |
Output is correct |
47 |
Correct |
1140 ms |
90736 KB |
Output is correct |
48 |
Correct |
2283 ms |
164600 KB |
Output is correct |
49 |
Correct |
175 ms |
34460 KB |
Output is correct |
50 |
Correct |
164 ms |
34732 KB |
Output is correct |
51 |
Correct |
189 ms |
36212 KB |
Output is correct |
52 |
Correct |
205 ms |
37352 KB |
Output is correct |
53 |
Correct |
210 ms |
37240 KB |
Output is correct |
54 |
Correct |
203 ms |
37356 KB |
Output is correct |