Submission #595491

#TimeUsernameProblemLanguageResultExecution timeMemory
595491penguinhackerStreet Lamps (APIO19_street_lamps)C++17
20 / 100
5082 ms524288 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ar array const int mxN=3e5; int n, q, ans[mxN], st[mxN]; string s; vector<int> changes[mxN]; vector<ar<int, 2>> ls[mxN]; vector<ar<int, 4>> queries; struct ft { ll ft[mxN+1]; void upd(int i, ll x) { for (++i; i<=mxN; i+=i&-i) ft[i]+=x; } ll qry(int i) { ll r=0; for (++i; i; i-=i&-i) r+=ft[i]; return r; } } ft1, ft2; void upd(int l, int r, int x) { ft1.upd(l, -(ll)(l-1)*x); ft2.upd(l, x); ft1.upd(r+1, (ll)r*x); ft2.upd(r+1, -x); } ll qry(int i) { return i*ft2.qry(i)+ft1.qry(i); } void solve(int l, int r) { if (l==r) return; int mid=(l+r)/2; solve(l, mid); solve(mid+1, r); vector<ar<int, 4>> tmp; vector<ar<int, 3>> rb; tmp.reserve(r-l+1); for (int i=l, j=mid+1; tmp.size()<r-l+1;) { if (j>r||i<=mid&&queries[i][0]<=queries[j][0]) { if (queries[i][2]!=-1) { // update upd(queries[i][1], queries[i][2], queries[i][3]); rb.push_back({queries[i][1], queries[i][2], -queries[i][3]}); } tmp.push_back(queries[i++]); } else { if (queries[j][2]==-1) // query ans[queries[j][1]]+=qry(queries[j][1]); tmp.push_back(queries[j++]); } } for (int i=l; i<=r; ++i) queries[i]=tmp[i-l]; for (auto [l, r, x] : rb) upd(l, r, x); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> q >> s; for (int i=0; i<n; ++i) if (s[i]=='0') changes[i].push_back(-1); for (int i=0; i<q; ++i) { string type; cin >> type; if (type=="toggle") { int x; cin >> x, --x; changes[x].push_back(i); ans[i]=-1; } else { int l, r; cin >> l >> r, --l, r-=2; ls[r].push_back({l, i}); } } vector<int> id(q); queries.push_back({0, 0, q-1, 1}); for (int i=0; i<n; ++i) { for (int j=0; j<changes[i].size(); j+=2) { int b=j+1<changes[i].size()?changes[i][j+1]:q-1; ar<int, 3> seg={changes[i][j]+1, b, i+1}; for (int k=seg[0]; k<=seg[1]; ++k) { queries.push_back({id[k], k, k, -1}); id[k]=i+1; } queries.push_back({seg[2], seg[0], seg[1], 1}); } for (auto [l, t] : ls[i]) queries.push_back({l, t, -1}); } //for (auto x : queries) // cout << x[0] << " " << x[1] << " " << x[2] << " " << x[3] << endl; solve(0, queries.size()-1); for (int i=0; i<q; ++i) if (~ans[i]) cout << ans[i] << "\n"; return 0; }

Compilation message (stderr)

street_lamps.cpp: In function 'void solve(int, int)':
street_lamps.cpp:48:35: warning: comparison of integer expressions of different signedness: 'std::vector<std::array<int, 4> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   48 |  for (int i=l, j=mid+1; tmp.size()<r-l+1;) {
      |                         ~~~~~~~~~~^~~~~~
street_lamps.cpp:49:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   49 |   if (j>r||i<=mid&&queries[i][0]<=queries[j][0]) {
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:91:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |   for (int j=0; j<changes[i].size(); j+=2) {
      |                 ~^~~~~~~~~~~~~~~~~~
street_lamps.cpp:92:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |    int b=j+1<changes[i].size()?changes[i][j+1]:q-1;
      |          ~~~^~~~~~~~~~~~~~~~~~
#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...