#include <bits/stdc++.h>
using namespace std;
void just_do_it();
int main() {
#ifdef KAMIRULEZ
freopen("kamirulez.inp", "r", stdin);
freopen("kamirulez.out", "w", stdout);
#endif
ios_base::sync_with_stdio(0);
cin.tie(0);
just_do_it();
return 0;
}
struct node {
int pref, suf;
vector<pair<int, int>> left_events;
vector<pair<int, int>> right_events;
vector<pair<int, pair<int, int>>> queries;
};
const int inf = 1e9 + 20;
const int maxN = 3e5 + 20;
int a[maxN];
int res[maxN];
node tr[maxN * 4];
int sum_single[maxN];
int prv_single[maxN];
void add_event(int id, int T) {
if (tr[id].left_events.empty() || tr[id * 2].suf != tr[id].left_events.back().second) {
tr[id].left_events.push_back({T, tr[id * 2].suf});
}
if (tr[id].right_events.empty() || tr[id * 2 + 1].pref != tr[id].right_events.back().second) {
tr[id].right_events.push_back({T, tr[id * 2 + 1].pref});
}
}
void merge(int id, int lt, int rt, int mt, int T) {
tr[id].pref = tr[id * 2].pref + (tr[id * 2].pref == mt - lt + 1 ? tr[id * 2 + 1].pref : 0);
tr[id].suf = tr[id * 2 + 1].suf + (tr[id * 2 + 1].suf == rt - mt ? tr[id * 2].suf : 0);
add_event(id, T);
}
void build(int id, int lt, int rt) {
if (lt == rt) {
tr[id].pref = a[lt];
tr[id].suf = a[lt];
return;
}
int mt = (lt + rt) / 2;
build(id * 2, lt, mt);
build(id * 2 + 1, mt + 1, rt);
merge(id, lt, rt, mt, 0);
}
void update(int id, int lt, int rt, int pos, int T) {
if (lt == rt) {
if (a[lt] == 1) {
sum_single[lt] += T - prv_single[lt];
}
prv_single[lt] = T;
a[lt] ^= 1;
tr[id].pref = a[lt];
tr[id].suf = a[lt];
return;
}
int mt = (lt + rt) / 2;
if (pos <= mt) {
update(id * 2, lt, mt, pos, T);
}
else {
update(id * 2 + 1, mt + 1, rt, pos, T);
}
merge(id, lt, rt, mt, T);
}
void add(int id, int lt, int rt, int ql, int qr, int T) {
if (lt == rt) {
res[T] = sum_single[lt];
if (a[lt] == 1) {
res[T] += T - prv_single[lt];
}
return;
}
int mt = (lt + rt) / 2;
if (qr <= mt) {
add(id * 2, lt, mt, ql, qr, T);
}
else if (ql >= mt + 1) {
add(id * 2 + 1, mt + 1, rt, ql, qr, T);
}
else {
tr[id].queries.push_back({T, {mt - ql + 1, qr - mt}});
}
}
struct BIT {
vector<vector<int>> pos;
vector<vector<int>> bit;
int n;
void init1(int _n) {
n = _n;
bit.clear();
bit.resize(n + 1);
pos.clear();
pos.resize(n + 1);
}
void fupdate(int x, int y) {
for (int i = x; i <= n; i += i & (-i)) {
pos[i].push_back(y);
}
}
void init2() {
for (int i = 1; i <= n; i++) {
sort(pos[i].begin(), pos[i].end());
pos[i].erase(unique(pos[i].begin(), pos[i].end()), pos[i].end());
bit[i].resize(pos[i].size() + 1);
}
}
void update(int x, int y, int val) {
for (int i = x; i <= n; i += i & (-i)) {
for (int j = upper_bound(pos[i].begin(), pos[i].end(), y) - pos[i].begin(); j <= (int)pos[i].size(); j += j & (-j)) {
bit[i][j] += val;
}
}
}
int get(int x, int y) {
int res = 0;
for (int i = x; i > 0; i -= i & (-i)) {
for (int j = upper_bound(pos[i].begin(), pos[i].end(), y) - pos[i].begin(); j > 0; j -= j & (-j)) {
res += bit[i][j];
}
}
return res;
}
} bit;
void solve(int id) {
vector<pair<int, pair<int, int>>> &queries = tr[id].queries;
vector<pair<int, int>> &left_events = tr[id].left_events;
vector<pair<int, int>> &right_events = tr[id].right_events;
if (queries.empty()) {
return;
}
left_events.push_back({inf, -1});
right_events.push_back({inf, -1});
vector<pair<int, pair<int, int>>> events;
int sz_left = left_events.size();
int sz_right = right_events.size();
int sz_queries = queries.size();
vector<int> left_pos(sz_left);
vector<int> right_pos(sz_right);
vector<int> query_pos(sz_queries);
for (int i = 0; i < sz_left; i++) {
events.push_back({left_events[i].first, {0, i}});
}
for (int i = 0; i < sz_right; i++) {
events.push_back({right_events[i].first, {1, i}});
}
for (int i = 0; i < sz_queries; i++) {
events.push_back({queries[i].first, {2, i}});
}
sort(events.begin(), events.end());
int n = 0;
vector<int> len;
for (int i = 0; i < (int)events.size(); i++) {
if (i > 0 && events[i].first != events[i - 1].first) {
len.push_back(events[i].first - events[i - 1].first);
n++;
}
if (events[i].second.first == 0) {
left_pos[events[i].second.second] = n;
}
if (events[i].second.first == 1) {
right_pos[events[i].second.second] = n;
}
if (events[i].second.first == 2) {
query_pos[events[i].second.second] = n - 1;
}
}
vector<int> left_val(n);
vector<int> right_val(n);
for (int i = 0; i < sz_left - 1; i++) {
for (int j = left_pos[i]; j < left_pos[i + 1]; j++) {
left_val[j] = left_events[i].second;
}
}
for (int i = 0; i < sz_right - 1; i++) {
for (int j = right_pos[i]; j < right_pos[i + 1]; j++) {
right_val[j] = right_events[i].second;
}
}
vector<pair<int, pair<int, int>>> left_query_events;
vector<pair<int, int>> right_vals;
for (int i = 0; i < n; i++) {
left_query_events.push_back({left_val[i], {1, i}});
right_vals.push_back({-right_val[i], i});
}
sort(right_vals.begin(), right_vals.end());
int cnt = 0;
vector<int> right_diff;
for (int i = 0; i < n; i++) {
if (i == 0 || right_vals[i].first != right_vals[i - 1].first) {
right_diff.push_back(right_vals[i].first);
cnt++;
}
right_val[right_vals[i].second] = cnt;
}
for (int i = 0; i < sz_queries; i++) {
queries[i].second.second = upper_bound(right_diff.begin(), right_diff.end(), -queries[i].second.second) - right_diff.begin();
}
for (int i = 0; i < sz_queries; i++) {
left_query_events.push_back({queries[i].second.first, {0, i}});
}
sort(left_query_events.begin(), left_query_events.end(), greater<>());
bit.init1(n);
for (auto e: left_query_events) {
if (e.second.first == 1) {
int pos = e.second.second;
bit.fupdate(pos + 1, right_val[pos]);
}
}
bit.init2();
for (auto e: left_query_events) {
if (e.second.first == 1) {
int pos = e.second.second;
bit.update(pos + 1, right_val[pos], len[pos]);
}
else {
int id = e.second.second;
int T = queries[id].first;
int Y = queries[id].second.second;
int pos = query_pos[id];
res[T] = bit.get(pos + 1, Y);
}
}
}
void solve(int id, int lt, int rt) {
if (lt == rt) {
return;
}
solve(id);
int mt = (lt + rt) / 2;
solve(id * 2, lt, mt);
solve(id * 2 + 1, mt + 1, rt);
}
void just_do_it() {
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
char c;
cin >> c;
a[i] = c - '0';
}
build(1, 1, n);
for (int T = 1; T <= q; T++) {
res[T] = -1;
string s;
cin >> s;
if (s == "toggle") {
int pos;
cin >> pos;
update(1, 1, n, pos, T);
}
if (s == "query") {
int ql, qr;
cin >> ql >> qr;
qr--;
add(1, 1, n, ql, qr, T);
}
}
solve(1, 1, n);
for (int i = 1; i <= q; i++) {
if (res[i] != -1) {
cout << res[i] << '\n';
}
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
49 ms |
94168 KB |
Output is correct |
2 |
Correct |
50 ms |
94220 KB |
Output is correct |
3 |
Correct |
51 ms |
94268 KB |
Output is correct |
4 |
Correct |
47 ms |
94256 KB |
Output is correct |
5 |
Correct |
45 ms |
94228 KB |
Output is correct |
6 |
Correct |
45 ms |
94160 KB |
Output is correct |
7 |
Correct |
46 ms |
94188 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
149 ms |
101192 KB |
Output is correct |
2 |
Correct |
161 ms |
101032 KB |
Output is correct |
3 |
Correct |
195 ms |
101772 KB |
Output is correct |
4 |
Correct |
429 ms |
122364 KB |
Output is correct |
5 |
Correct |
458 ms |
121516 KB |
Output is correct |
6 |
Correct |
469 ms |
123268 KB |
Output is correct |
7 |
Correct |
229 ms |
115988 KB |
Output is correct |
8 |
Correct |
229 ms |
117384 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
48 ms |
94340 KB |
Output is correct |
2 |
Correct |
55 ms |
94328 KB |
Output is correct |
3 |
Correct |
54 ms |
94380 KB |
Output is correct |
4 |
Correct |
52 ms |
94400 KB |
Output is correct |
5 |
Correct |
572 ms |
124948 KB |
Output is correct |
6 |
Correct |
669 ms |
130048 KB |
Output is correct |
7 |
Correct |
673 ms |
138604 KB |
Output is correct |
8 |
Correct |
520 ms |
149424 KB |
Output is correct |
9 |
Correct |
292 ms |
121540 KB |
Output is correct |
10 |
Correct |
327 ms |
126244 KB |
Output is correct |
11 |
Correct |
331 ms |
123760 KB |
Output is correct |
12 |
Correct |
444 ms |
150416 KB |
Output is correct |
13 |
Correct |
531 ms |
149484 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
46 ms |
94412 KB |
Output is correct |
2 |
Correct |
58 ms |
94344 KB |
Output is correct |
3 |
Correct |
61 ms |
94280 KB |
Output is correct |
4 |
Correct |
47 ms |
94260 KB |
Output is correct |
5 |
Correct |
473 ms |
151912 KB |
Output is correct |
6 |
Correct |
586 ms |
141752 KB |
Output is correct |
7 |
Correct |
604 ms |
133388 KB |
Output is correct |
8 |
Correct |
690 ms |
126732 KB |
Output is correct |
9 |
Correct |
583 ms |
111880 KB |
Output is correct |
10 |
Correct |
609 ms |
106400 KB |
Output is correct |
11 |
Correct |
589 ms |
111680 KB |
Output is correct |
12 |
Correct |
690 ms |
106352 KB |
Output is correct |
13 |
Correct |
629 ms |
111640 KB |
Output is correct |
14 |
Correct |
707 ms |
106552 KB |
Output is correct |
15 |
Correct |
523 ms |
150368 KB |
Output is correct |
16 |
Correct |
585 ms |
148952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
49 ms |
94168 KB |
Output is correct |
2 |
Correct |
50 ms |
94220 KB |
Output is correct |
3 |
Correct |
51 ms |
94268 KB |
Output is correct |
4 |
Correct |
47 ms |
94256 KB |
Output is correct |
5 |
Correct |
45 ms |
94228 KB |
Output is correct |
6 |
Correct |
45 ms |
94160 KB |
Output is correct |
7 |
Correct |
46 ms |
94188 KB |
Output is correct |
8 |
Correct |
149 ms |
101192 KB |
Output is correct |
9 |
Correct |
161 ms |
101032 KB |
Output is correct |
10 |
Correct |
195 ms |
101772 KB |
Output is correct |
11 |
Correct |
429 ms |
122364 KB |
Output is correct |
12 |
Correct |
458 ms |
121516 KB |
Output is correct |
13 |
Correct |
469 ms |
123268 KB |
Output is correct |
14 |
Correct |
229 ms |
115988 KB |
Output is correct |
15 |
Correct |
229 ms |
117384 KB |
Output is correct |
16 |
Correct |
48 ms |
94340 KB |
Output is correct |
17 |
Correct |
55 ms |
94328 KB |
Output is correct |
18 |
Correct |
54 ms |
94380 KB |
Output is correct |
19 |
Correct |
52 ms |
94400 KB |
Output is correct |
20 |
Correct |
572 ms |
124948 KB |
Output is correct |
21 |
Correct |
669 ms |
130048 KB |
Output is correct |
22 |
Correct |
673 ms |
138604 KB |
Output is correct |
23 |
Correct |
520 ms |
149424 KB |
Output is correct |
24 |
Correct |
292 ms |
121540 KB |
Output is correct |
25 |
Correct |
327 ms |
126244 KB |
Output is correct |
26 |
Correct |
331 ms |
123760 KB |
Output is correct |
27 |
Correct |
444 ms |
150416 KB |
Output is correct |
28 |
Correct |
531 ms |
149484 KB |
Output is correct |
29 |
Correct |
46 ms |
94412 KB |
Output is correct |
30 |
Correct |
58 ms |
94344 KB |
Output is correct |
31 |
Correct |
61 ms |
94280 KB |
Output is correct |
32 |
Correct |
47 ms |
94260 KB |
Output is correct |
33 |
Correct |
473 ms |
151912 KB |
Output is correct |
34 |
Correct |
586 ms |
141752 KB |
Output is correct |
35 |
Correct |
604 ms |
133388 KB |
Output is correct |
36 |
Correct |
690 ms |
126732 KB |
Output is correct |
37 |
Correct |
583 ms |
111880 KB |
Output is correct |
38 |
Correct |
609 ms |
106400 KB |
Output is correct |
39 |
Correct |
589 ms |
111680 KB |
Output is correct |
40 |
Correct |
690 ms |
106352 KB |
Output is correct |
41 |
Correct |
629 ms |
111640 KB |
Output is correct |
42 |
Correct |
707 ms |
106552 KB |
Output is correct |
43 |
Correct |
523 ms |
150368 KB |
Output is correct |
44 |
Correct |
585 ms |
148952 KB |
Output is correct |
45 |
Correct |
439 ms |
116156 KB |
Output is correct |
46 |
Correct |
425 ms |
111208 KB |
Output is correct |
47 |
Correct |
422 ms |
118668 KB |
Output is correct |
48 |
Correct |
697 ms |
141796 KB |
Output is correct |
49 |
Correct |
339 ms |
133544 KB |
Output is correct |
50 |
Correct |
379 ms |
133448 KB |
Output is correct |
51 |
Correct |
398 ms |
133632 KB |
Output is correct |
52 |
Correct |
363 ms |
134392 KB |
Output is correct |
53 |
Correct |
341 ms |
134384 KB |
Output is correct |
54 |
Correct |
346 ms |
134296 KB |
Output is correct |