Submission #979060

#TimeUsernameProblemLanguageResultExecution timeMemory
979060KenjikrabStreet Lamps (APIO19_street_lamps)C++14
80 / 100
5037 ms43376 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[3*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&-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];}); } signed main() { cin.tie(nullptr)->sync_with_stdio(false); memset(ans,-1,sizeof(ans)); int n,q; scanf("%d%d%s",&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]; for(int i=1;i<=q;i++) { scanf("%s",com); if(com[0]=='q') { int a,b; scanf("%d%d",&a,&b); b--; arr[cnt++]={a,b,0,i}; ans[i]=*zero.lower_bound(a)<=b? 0:i; } else { int a; scanf("%d",&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 printf("%d\n",ans[i]); } return 0; }

Compilation message (stderr)

street_lamps.cpp: In function 'int qr(int)':
street_lamps.cpp:22:9: warning: statement has no effect [-Wunused-value]
   22 |     for(idx;idx;idx-=idx&-idx)ret+=fen[idx];
      |         ^~~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |     scanf("%d%d%s",&n,&q,s);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
street_lamps.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |         scanf("%s",com);
      |         ~~~~~^~~~~~~~~~
street_lamps.cpp:62:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |             scanf("%d%d",&a,&b);
      |             ~~~~~^~~~~~~~~~~~~~
street_lamps.cpp:70:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |             scanf("%d",&a);
      |             ~~~~~^~~~~~~~~
#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...