Submission #979069

#TimeUsernameProblemLanguageResultExecution timeMemory
979069KenjikrabStreet Lamps (APIO19_street_lamps)C++14
80 / 100
5058 ms47832 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx,avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> using namespace std; typedef array<int,4> arr4; int const n_max=3e5+15; set<int> zero; //char s[n_max]; arr4 arr[4*n_max]; int ans[n_max]; int cnt=0; int fen[n_max]; inline void upd(int idx,int val) { for(;idx<n_max;idx+=idx&-idx)fen[idx]+=val; } inline int qr(int idx) { int ret=0; for(;idx;idx-=idx&-idx)ret+=fen[idx]; return ret; } void sol(int l,int r) { if(l>=r)return; int mid=(l+r)>>1,p=l; sol(l,mid);sol(mid+1,r); for(int i=mid+1;i<=r;i++) { if(arr[i][2])continue; while(p<=mid&&arr[p][1]>=arr[i][1]){upd(arr[p][3],arr[p][2]),p++;} ans[arr[i][3]]+=qr(arr[i][3]); } for(int i=l;i<p;i++) { upd(arr[i][3],-arr[i][2]); } inplace_merge(arr+l,arr+mid+1,arr+r+1,[&](const arr4 &a,const arr4 &b) {return a[1]>b[1];}); } string s; int n,q; signed main() { cin.tie(nullptr)->sync_with_stdio(false); memset(ans,-1,sizeof(ans)); //scanf("%d%d%s",&n,&q,s+1); cin>>n>>q>>s; zero.insert(0); for(int i=0;i<n;i++) { if(!(s[i]-='0'))zero.insert(i+1); } zero.insert(n+1); //char com[10]; string com; int a,b; for(int i=1;i<=q;i++) { //scanf("%s",com); cin>>com; if(com[0]=='q') { //scanf("%d%d",&a,&b); cin>>a>>b; b--; arr[cnt++]={a,b,0,i}; ans[i]=*zero.lower_bound(a)<=b? 0:i; } else { //scanf("%d",&a); cin>>a; if(s[a-1]) { auto it=zero.insert(a).first; int l=*prev(it),m=a,r=*next(it); arr[cnt++]={l+1,r-1,i,i}; arr[cnt++]={l+1,m-1,-i,i}; arr[cnt++]={m+1,r-1,-i,i}; } else { auto it=zero.find(a); int l=*prev(it),m=a,r=*next(it); arr[cnt++]={l+1,r-1,-i,i}; arr[cnt++]={l+1,m-1,i,i}; arr[cnt++]={m+1,r-1,i,i}; zero.erase(it); } s[a-1]^=1; } } sort(arr, arr+cnt, [&](const arr4 &a, const arr4 &b) {return a[0]^b[0] ? a[0]<b[0] : ((a[1]!=b[1])? a[1]>b[1]:(b[2]==0)); }); sol(0,cnt-1); for(int i=1;i<=q;i++) { if(ans[i]==-1)continue; else cout<<ans[i]<<"\n";//printf("%d\n",ans[i]); } 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...