Submission #973062

#TimeUsernameProblemLanguageResultExecution timeMemory
973062simona1230Street Lamps (APIO19_street_lamps)C++17
0 / 100
431 ms4188 KiB
#include <bits/stdc++.h> using namespace std; int n,q; struct node { int l,r; int val; node(){} node(int _l,int _r,int v) { l=_l; r=_r; val=v; } }; struct segmentTree { vector<node> v={{-1,-1,0}}; void makeLeft(int i) { v[i].l=v.size(); v.push_back({-1,-1,0}); } void makeRight(int i) { v[i].r=v.size(); v.push_back({-1,-1,0}); } int query(int i,int l,int r,int ql,int qr) { if(ql>qr)return 0; if(ql<=l&&r<=qr)return v[i].val; if(v[i].l==-1)makeLeft(i); if(v[i].r==-1)makeRight(i); int m=(l+r)/2; return query(v[i].l,l,m,ql,min(qr,m))+query(v[i].r,m+1,r,max(ql,m+1),qr); } void update(int i,int l,int r,int idx,int val) { //cout<<l<<" nml "<<r<<endl; if(l==r) { if(val>0)v[i].val+=val; else v[i].val=val; return; } if(v[i].l==-1)makeLeft(i); if(v[i].r==-1)makeRight(i); int lf=v[i].l,rt=v[i].r; int m=(l+r)/2; if(idx<=m)update(lf,l,m,idx,val); else update(rt,m+1,r,idx,val); v[i].val=v[lf].val+v[rt].val; } }; struct twoDnode { segmentTree s; int l,r; twoDnode(){} twoDnode(segmentTree _s,int _l,int _r) { s=_s; l=_l; r=_r; } }; struct twoD { segmentTree g; vector<twoDnode> v={{g,-1,-1}}; void makeLeft(int i) { v[i].l=v.size(); v.push_back({g,-1,-1}); } void makeRight(int i) { v[i].r=v.size(); v.push_back({g,-1,-1}); } void update(int i,int l,int r,int idx,int val,int other) { //cout<<l<<" 2d "<<r<<endl; if(l==r) { v[i].s.update(0,1,n,other,val); return; } if(v[i].l==-1)makeLeft(i); if(v[i].r==-1)makeRight(i); int lf=v[i].l,rt=v[i].r; //cout<<lf<<" "<<rt<<endl; int m=(l+r)/2; if(idx<=m)update(lf,l,m,idx,val,other); else update(rt,m+1,r,idx,val,other); int curr=v[lf].s.query(0,1,n,other,other)+v[rt].s.query(0,1,n,other,other); v[i].s.update(0,1,n,other,-curr); } int query(int i,int l,int r,int ql,int qr,int h1,int h2) { if(ql>qr)return 0; if(ql<=l&&r<=qr)return v[i].s.query(0,1,n,h1,h2); if(v[i].l==-1)makeLeft(i); if(v[i].r==-1)makeRight(i); int lf=v[i].l,rt=v[i].r; int m=(l+r)/2; return query(lf,l,m,ql,min(qr,m),h1,h2)+query(rt,m+1,r,max(m+1,ql),qr,h1,h2); } }; twoD s; set<int> itv; int l[300001],r[300001],tmr[300001]; char c[300001]; void read() { cin>>n>>q; int bg=-1; for(int i=1;i<=n;i++) { cin>>c[i]; if(c[i]=='0') { if(bg!=-1) { itv.insert(bg); r[bg]=i-1; tmr[bg]=0; } bg=-1; } else { if(bg==-1)bg=i; } } if(bg!=-1) { itv.insert(bg); r[bg]=n; tmr[bg]=0; } } void solve() { c[0]=c[n+1]='0'; for(int i=1;i<=q;i++) { string tp; int x,y; cin>>tp; if(tp=="toggle") { cin>>x; if(c[x]=='0') { c[x]='1'; if(c[x-1]=='0'&&c[x+1]=='0') { itv.insert(x); r[x]=x; tmr[x]=i; } else if(c[x-1]=='0') { s.update(0,1,n,x+1,i-tmr[x+1],r[x+1]); r[x]=r[x+1]; tmr[x]=i; itv.erase(x+1); itv.insert(x); } else if(c[x+1]=='0') { auto it=itv.upper_bound(x); it--; int lf=*it; s.update(0,1,n,lf,i-tmr[lf],x-1); r[lf]=x; tmr[lf]=i; } else { //cout<<"in"<<endl; auto it=itv.upper_bound(x); it--; int lf=*it; s.update(0,1,n,lf,i-tmr[lf],x-1); s.update(0,1,n,x+1,i-tmr[x+1],r[x+1]); r[lf]=r[x+1]; tmr[lf]=i; //cout<<lf<<" "<<r[x+1]<<endl; itv.erase(x+1); } } else { c[x]='0'; auto it=itv.upper_bound(x); it--; s.update(0,1,n,*it,i-tmr[*it],r[*it]); if(c[x-1]=='0'&&c[x+1]=='0') { itv.erase(x); } else if(c[x-1]=='0') { itv.erase(x); itv.insert(x+1); tmr[x+1]=i; r[x+1]=r[x]; } else if(c[x+1]=='0') { tmr[*it]=i; r[*it]=x-1; } else { tmr[*it]=tmr[x+1]=i; r[x+1]=r[*it]; r[*it]=x-1; itv.insert(x+1); } } } if(tp=="query") { cin>>x>>y; int add=0; if(itv.size()) { auto it=itv.upper_bound(x); it--; if(*itv.begin()<=x&&r[*it]>=y-1) add=i-tmr[*it]; } cout<<add+s.query(0,1,n,1,x,y-1,n)<<endl; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); solve(); 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...