Submission #166627

#TimeUsernameProblemLanguageResultExecution timeMemory
166627combi1k1Street Lamps (APIO19_street_lamps)C++14
100 / 100
2300 ms99656 KiB
#include<bits/stdc++.h> using namespace std; #define X first #define Y second #define pb emplace_back #define sz(x) x.size() #define all(x) x.begin(),x.end() #define ops tuple<int,int,int> const int N = 3e5 + 5; typedef pair<int,int> ii; namespace BIT2D { vector<int> val[N]; vector<int> bit[N]; void ini() { for(int i = 1 ; i < N ; ++i) { sort(all(val[i])); val[i].resize(unique(all(val[i])) - val[i].begin()); bit[i].resize(sz(val[i]) + 5); } } void add(int x,int y) { for(; x < N ; x += x & -x) val[x].push_back(y); } void upd(int x,int y,int v) { for(; x < N ; x += x & -x) { int p = lower_bound(all(val[x]),y) - val[x].begin() + 1; for(; p > 0 ; p -= p & -p) bit[x][p] += v; } } int get(int x,int y) { int ans = 0; for(; x > 0 ; x -= x & -x) { int p = lower_bound(all(val[x]),y) - val[x].begin() + 1; int K = sz(bit[x]); for(; p < K ; p += p & -p) ans += bit[x][p]; } return ans; } } using BIT2D::upd; using BIT2D::get; bool on[N]; set<ii> S; vector<ops> Q[N]; int l[N]; int r[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; int q; cin >> q; ++q; for(int i = 1 ; i <= n ; ++i) { char c; cin >> c; if (c == '1') { if (on[i - 1]) { ii seg = (*--S.end()); S.erase (seg); seg.Y = i; S.insert(seg); } else S.insert(ii(i,i)); on[i] = 1; } } for(ii e : S) Q[1].pb(1,e.X,e.Y); string t; for(int i = 2 ; i <= q ; ++i) { int x, y; cin >> t >> x; if (t == "query") { cin >> y; l[i] = x; r[i] = y - 1; continue; } if (on[x]) { auto it = S.upper_bound(ii(x,n)); ii range = (*--it); int L = range.X; int R = range.Y; if (L < x) S.insert(ii(L,x - 1)), Q[i].pb(1,L,x - 1); if (R > x) S.insert(ii(x + 1,R)), Q[i].pb(1,x + 1,R); S.erase(range); Q[i].pb(0,L,R); } else { int l = x; int r = x; if (on[x + 1]) { auto it = S.upper_bound(ii(x,x)); r = (*it).Y; Q[i].pb(0,x + 1,r); S.erase(it); } if (on[x - 1]) { auto it = S.upper_bound(ii(x,x)); --it; l = (*it).X; Q[i].pb(0,l,x - 1); S.erase(it); } S.insert({l,r}); Q[i].pb(1,l,r); } on[x] ^= 1; } for(int i = 1 ; i <= q ; ++i) for(ops _ : Q[i]) { int v, x, y; tie(v, x, y) = _; BIT2D::add(x,y); } BIT2D::ini(); Q[1].pb(1,N,0); for(int i = 1 ; i <= q ; ++i) { if (Q[i].empty()) { int ans = get(l[i],r[i]); if (ans < 0) ans += i; cout << ans << "\n"; } for(ops _ : Q[i]) { int v, x, y; tie(v, x, y) = _; if (v) upd(x,y,-i); else upd(x,y, i); } } } /* 5 7 11011 query 1 2 query 1 2 query 1 6 query 3 4 toggle 3 query 3 4 query 1 6 */
#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...