Submission #721627

#TimeUsernameProblemLanguageResultExecution timeMemory
721627alvingogoStreet Lamps (APIO19_street_lamps)C++14
100 / 100
2722 ms201256 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define p_q priority_queue #define int long long using namespace std; vector<vector<int> > to; struct BIT{ int n; vector<int> bt; void init(int x){ n=x; bt.resize(n+1); } void update(int x,int y){ x++; for(;x<=n;x+=(x&-x)){ bt[x]+=y; } } int query(int x){ x++; int ans=0; for(;x>0;x-=(x&-x)){ ans+=bt[x]; } return ans; } }; struct BBIT{ int n; vector<BIT> v; BBIT(int x,vector<int> t){ n=x; v.resize(n+1); for(int i=1;i<=n;i++){ v[i].init(t[i]); } } void update(int x,int y,int z){ x++; for(;x<=n;x+=(x&-x)){ v[x].update(lower_bound(to[x].begin(),to[x].end(),y)-to[x].begin(),z); } } int query(int a,int y){ a++; int ans=0; for(;a>0;a-=(a&-a)){ ans+=v[a].query(lower_bound(to[a].begin(),to[a].end(),y)-to[a].begin()); } return ans; } }; signed main(){ AquA; int n,q; cin >> n >> q; set<pair<int,int> > s; string x; cin >> x; vector<pair<pair<int,int>,int> > vz; auto add=[&](int a,int b,int c,int d,int x){ vz.push_back({{a,c},x}); vz.push_back({{a,d+1},-x}); vz.push_back({{b+1,c},-x}); vz.push_back({{b+1,d+1},x}); }; int l=-1,r=0; for(int i=0;i<n;i++){ if(x[i]=='0'){ if(l==-1){ continue; } s.insert({l,r}); l=-1; } else{ if(l==-1){ l=i; } r=max(r,i); } } if(l!=-1){ s.insert({l,r}); } for(int i=1;i<=q;i++){ string tf; cin >> tf; if(tf[0]=='q'){ int a,b; cin >> a >> b; a--; b--; int flag=0; if(s.lower_bound(make_pair(a,1e9))!=s.begin()){ auto h=*prev(s.lower_bound(make_pair(a,1e9))); if(h.fs<=a && h.sc>=b-1){ flag=i; } } vz.push_back({{a,-b},flag}); //cout << bt.query(a,b)+flag << '\n'; } else{ int z; cin >> z; z--; if(x[z]=='1'){ auto u=*prev(s.lower_bound(make_pair(z,1e9))); s.erase(u); add(u.fs,z,z+1,u.sc+1,i); if(u.fs<=z-1){ s.insert({u.fs,z-1}); } if(z+1<=u.sc){ s.insert({z+1,u.sc}); } x[z]='0'; } else{ int al=z,ar=z; auto p=s.lower_bound(make_pair(z,-1)); if(p!=s.begin()){ auto u=prev(p); if((*u).sc==z-1){ al=(*u).fs; s.erase(u); } } if(p!=s.end() && (*p).fs==z+1){ ar=(*p).sc; s.erase(p); } //cout << al << " " << z << " " << ar << endl; add(al,z,z+1,ar+1,-i); s.insert({al,ar}); x[z]='1'; } } } vector<int> xx(n+6); to.resize(n+6); for(auto h:vz){ if(h.fs.sc<0){ for(int i=h.fs.fs+1;i>0;i-=(i&-i)){ to[i].push_back(-h.fs.sc); } } else{ for(int i=h.fs.fs+1;i<=n+5;i+=(i&-i)){ to[i].push_back(h.fs.sc); } } } for(int i=0;i<=n+5;i++){ sort(to[i].begin(),to[i].end()); to[i].erase(unique(to[i].begin(),to[i].end()),to[i].end()); xx[i]=to[i].size(); } BBIT bt(n+5,xx); for(auto h:vz){ if(h.fs.sc<0){ cout << bt.query(h.fs.fs,-h.fs.sc)+h.sc << "\n"; } else{ bt.update(h.fs.fs,h.fs.sc,h.sc); } } return 0; }
#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...