Submission #932065

#TimeUsernameProblemLanguageResultExecution timeMemory
932065amirhoseinfar1385Street Lamps (APIO19_street_lamps)C++17
100 / 100
2813 ms477940 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=500000+10; int n,q,all[maxn],res[maxn],now,qu[maxn]; set<int>st; int fn[maxn],kaf=(1<<19); struct offt2fen{ vector<pair<int,int>>ady[maxn]; void upd(int l,int r,int w){ l++; r++; while(l<maxn){ if(l<0){ return ; } ady[l].push_back(make_pair(-r,w)); l+=((-l)&l); } } void pors(int l,int r,int w){ l++; r++; while(l>0){ ady[l].push_back(make_pair(r,w)); l-=((-l)&l); } } void cal(int i){ for(auto x:ady[i]){ if(x.first<0){ x.first=-x.first; while(x.first<maxn){ fn[x.first]+=x.second; x.first+=((-x.first)&x.first); } } else{ while(x.first>0){ res[x.second]+=fn[x.first]; x.first-=((-x.first)&x.first); } } } for(auto x:ady[i]){ if(x.first<0){ x.first=-x.first; while(x.first<maxn){ fn[x.first]=0; x.first+=((-x.first)&x.first); } } } } void build(){ for(int i=0;i<maxn;i++){ cal(i); } } }fen; void calu(int l,int r,int w){ if(l>r){ return ; } fen.upd(l,l,w); fen.upd(l,r+1,-w); fen.upd(r+1,l,-w); fen.upd(r+1,r+1,w); } void upd(int ind){ st.erase(ind); if(ind>=(*st.rbegin())||(ind<=(*st.begin()))){ return ; } auto y=st.lower_bound(ind); int nx=*y; y--; int ps=*y; if(all[ind]){ calu(ps+1,ind-1,-(maxn-now)); calu(ind+1,nx-1,-(maxn-now)); calu(ps+1,nx-1,maxn-now); } else{ calu(ps+1,nx-1,-(maxn-now)); calu(ps+1,ind-1,(maxn-now)); calu(ind+1,nx-1,(maxn-now)); st.insert(ind); } all[ind]^=1; } void pors(int l,int r){ auto x=*st.lower_bound(l); if(x>r){ res[now]-=maxn-now; } fen.pors(l,r,now); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin>>n>>q; st.insert(0); st.insert(n+1); calu(1,n,maxn); for(int i=1;i<=n;i++){ char c; cin>>c; all[i]=c-'0'; all[i]^=1; if(all[i]==1){ all[i]=0; upd(i); } } for(int i=1;i<=q;i++){ now=i; string s; int l,r; cin>>s>>l; if(s[0]=='q'){ cin>>r; r--; pors(l,r); qu[now]=1; } else{ upd(l); } } fen.build(); for(int i=1;i<=q;i++){ if(qu[i]==1){ cout<<res[i]<<"\n"; } } }
#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...