Submission #706080

#TimeUsernameProblemLanguageResultExecution timeMemory
706080fatemetmhrStreet Lamps (APIO19_street_lamps)C++17
100 / 100
2758 ms251176 KiB
// ~ Be Name Khoda ~ #include <bits/stdc++.h> //#pragma GCC optimize ("Ofast") //#pragma GCC target("avx2") //#pragma GCC optimize("unroll-loops,O3") using namespace std; typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second const int maxn = 1e6 + 10; const int maxn5 = 3e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const ll inf = 1e18; struct segment_tree{ vector <int> lazy; int n; inline void add(int l, int r, int lq, int rq, int val, int v){ if(rq <= l || r <= lq) return; if(lq <= l && r <= rq){ lazy[v] += val; return; } int mid = (l + r) >> 1; add(l, mid, lq, rq, val, v * 2); add(mid, r, lq, rq, val, v * 2 + 1); } inline int get(int l, int r, int id, int v){ if(r - l == 1) return lazy[v]; int mid = (l + r) >> 1; if(id < mid) return get(l, mid, id, v * 2) + lazy[v]; return get(mid, r, id, v * 2 + 1) + lazy[v]; } } seg[maxnt]; set <int> av; string ty[maxn5]; int x[maxn5], y[maxn5]; vector <int> have[maxnt], req[maxn5]; void build(int l, int r, int v){ if(r - l == 1){ for(auto u : req[l]) have[v].pb(u); sort(all(have[v])); } else{ int mid = (l + r) >> 1; build(l, mid, v * 2); build(mid, r, v * 2 + 1); int pt1 = 0, pt2 = 0; while(pt1 < have[v * 2].size() || pt2 < have[v * 2 + 1].size()){ if(pt1 < have[v * 2].size() && (pt2 == have[v * 2 + 1].size() || have[v * 2][pt1] < have[v * 2 + 1][pt2])) have[v].pb(have[v * 2][pt1++]); else have[v].pb(have[v * 2 + 1][pt2++]); } } have[v].resize(unique(all(have[v])) - have[v].begin()); seg[v].n = have[v].size(); seg[v].lazy.resize((seg[v].n << 2) + 5); } void add(int l, int r, int lq, int rq, int lq2, int rq2, int val, int v){ if(rq <= l || r <= lq) return; if(lq <= l && r <= rq){ int ptl = lower_bound(all(have[v]), lq2) - have[v].begin(); int ptr = lower_bound(all(have[v]), rq2) - have[v].begin(); if(ptl < ptr) seg[v].add(0, seg[v].n, ptl, ptr, val, 1); return; } int mid = (l + r) >> 1; add(l, mid, lq, rq, lq2, rq2, val, v * 2); add(mid, r, lq, rq, lq2, rq2, val, v * 2 + 1); } int get(int l, int r, int id1, int id2, int v){ int pt = lower_bound(all(have[v]), id2) - have[v].begin(); int ret = 0; if(pt < have[v].size() && have[v][pt] == id2) ret += seg[v].get(0, seg[v].n, pt, 1); if(r - l > 1){ int mid = (l + r) >> 1; if(id1 < mid) ret += get(l, mid, id1, id2, v * 2); else ret += get(mid, r, id1, id2, v * 2 + 1); } return ret; } inline bool is_ok(int l, int r){ auto it = av.lower_bound(l); if((*it) <= r) return false; return true; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; string s; cin >> s; for(int i = 0; i < q; i++){ cin >> ty[i] >> x[i]; x[i]--; if(ty[i] == "query"){ cin >> y[i]; y[i] -= 2; req[x[i]].pb(y[i]); } } build(0, n, 1); int last = 0; for(int i = 0; i < n; i++) if(s[i] == '0'){ av.insert(i); if(last < i) add(0, n, last, i, last, i, q, 1); last = i + 1; } if(last < n) add(0, n, last, n, last, n, q, 1); av.insert(-1); av.insert(n); for(int i = 0; i < q; i++){ if(ty[i] == "query") cout << get(0, n, x[i], y[i], 1) + (is_ok(x[i], y[i]) ? -1 : 0) * (q - i - 1) << '\n'; else{ bool cur = av.find(x[i]) == av.end(); av.erase(x[i]); auto it = av.lower_bound(x[i]); int r = *it; it--; int l = *it; add(0, n, l + 1, x[i] + 1, x[i], r, (cur ? -1 : 1) * (q - i - 1), 1); if(cur) av.insert(x[i]); } } }

Compilation message (stderr)

street_lamps.cpp: In function 'void build(int, int, int)':
street_lamps.cpp:69:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |         while(pt1 < have[v * 2].size() || pt2 < have[v * 2 + 1].size()){
      |               ~~~~^~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:69:47: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |         while(pt1 < have[v * 2].size() || pt2 < have[v * 2 + 1].size()){
      |                                           ~~~~^~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:70:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |             if(pt1 < have[v * 2].size() && (pt2 == have[v * 2 + 1].size() || have[v * 2][pt1] < have[v * 2 + 1][pt2]))
      |                ~~~~^~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:70:49: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |             if(pt1 < have[v * 2].size() && (pt2 == have[v * 2 + 1].size() || have[v * 2][pt1] < have[v * 2 + 1][pt2]))
      |                                             ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
street_lamps.cpp: In function 'int get(int, int, int, int, int)':
street_lamps.cpp:99:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |     if(pt < have[v].size() && have[v][pt] == id2)
      |        ~~~^~~~~~~~~~~~~~~~
#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...