Submission #253551

#TimeUsernameProblemLanguageResultExecution timeMemory
253551SaboonStreet Lamps (APIO19_street_lamps)C++14
100 / 100
3586 ms119820 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e5 + 20; int n; set<int> zi; vector<int> fenidx[maxn], fen[maxn]; int Q1[maxn], Q2[maxn]; string type[maxn]; int get(int x, int y){ int ret = 0; for (int i = x; i; i -= i & -i) for (int j = lower_bound(fenidx[i].begin(),fenidx[i].end(),y)-fenidx[i].begin()+1; j; j -= j & -j) ret += fen[i][j-1]; return ret; } void add(int x, int y, int val){ for (int i = x; i < maxn; i += i & -i) for (int j = lower_bound(fenidx[i].begin(),fenidx[i].end(),y)-fenidx[i].begin()+1; j <= fen[i].size(); j += j & -j) fen[i][j-1] += val; } void getinit(int x, int y){ for (int i = x; i; i -= i & -i) fenidx[i].push_back(y); } void addinit(int x, int y){ for (int i = x; i < maxn; i += i & -i) fenidx[i].push_back(y); } int getnex(int idx){ auto it = zi.lower_bound(idx); return it == zi.end() ? n+1 : *it; } int getpre(int idx){ auto it = zi.lower_bound(idx); if (it == zi.begin()) return 1; it --; return it == zi.end() ? 1 : *it + 1; } int main(){ ios_base::sync_with_stdio(false); int q; string s; cin >> n >> q >> s; for (int i = 1; i <= n; i++) if (s[i-1] == '0') zi.insert(i); string copys = s; for (int i = 1; i <= q; i++){ cin >> type[i]; if (type[i] == "toggle"){ int now = Q1[i]; cin >> Q1[i]; if (s[now-1] == '1'){ int pre = getpre(Q1[i]), now = Q1[i], nex = getnex(Q1[i]+1); addinit(pre, now+1), addinit(pre, nex+1), addinit(now+1, now+1), addinit(now+1, nex+1), s[now-1] = '0'; zi.insert(now); } else{ int pre = getpre(Q1[i]), now = Q1[i], nex = getnex(Q1[i]+1); addinit(pre, now+1), addinit(pre, nex+1), addinit(now+1, now+1), addinit(now+1, nex+1), s[now-1] = '1'; zi.erase(now); } } else{ cin >> Q1[i] >> Q2[i]; getinit(Q1[i], Q2[i]); } } s = copys; zi.clear(); for (int i = 1; i <= n; i++) if (s[i-1] == '0') zi.insert(i); for (int i = 1; i < maxn; i++){ sort(fenidx[i].begin(), fenidx[i].end()); fenidx[i].resize(unique(fenidx[i].begin(),fenidx[i].end())-fenidx[i].begin()); fen[i].resize(fenidx[i].size()); } for (int i = 1; i <= q; i++){ if (type[i] == "toggle"){ int now = Q1[i]; if (s[now-1] == '1'){ int pre = getpre(Q1[i]), now = Q1[i], nex = getnex(Q1[i]+1); add(pre, now+1, +i), add(pre, nex+1, -i), add(now+1, now+1, -i), add(now+1, nex+1, +i), s[now-1] = '0'; zi.insert(now); } else{ int pre = getpre(Q1[i]), now = Q1[i], nex = getnex(Q1[i]+1); add(pre, now+1, -i), add(pre, nex+1, +i), add(now+1, now+1, +i), add(now+1, nex+1, -i), s[now-1] = '1'; zi.erase(now); } } else{ cin >> Q1[i] >> Q2[i]; int k = getnex(Q1[i]); if (k < Q2[i]) cout << get(Q1[i], Q2[i]) << '\n'; else cout << i + get(Q1[i], Q2[i]) << '\n'; } } }

Compilation message (stderr)

street_lamps.cpp: In function 'void add(int, int, int)':
street_lamps.cpp:22:88: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = lower_bound(fenidx[i].begin(),fenidx[i].end(),y)-fenidx[i].begin()+1; j <= fen[i].size(); j += j & -j)
                                                                                      ~~^~~~~~~~~~~~~~~~
#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...