Submission #979039

#TimeUsernameProblemLanguageResultExecution timeMemory
979039KenjikrabStreet Lamps (APIO19_street_lamps)C++14
80 / 100
5028 ms47960 KiB
// #pragma GCC optimize("Ofast,no-stack-protector") // #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+10; set<int> zero; char s[n_max]; arr4 arr[3*n_max]; int ans[n_max]; int cnt=0; int fen[n_max]; void upd(int idx,int val) { for(;idx<n_max;idx+=idx&-idx)fen[idx]+=val; } 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; sol(l,mid);sol(mid+1,r); int p=l; 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+1); zero.insert(0); for(int i=1;i<=n;i++) { if(!(s[i]-='0'))zero.insert(i); } 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]) { auto it=zero.upper_bound(a); int l=*prev(it),m=a,r=*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.insert(a); } 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; } } 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:49:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |     scanf("%d%d%s",&n,&q,s+1);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~
street_lamps.cpp:59:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         scanf("%s",com);
      |         ~~~~~^~~~~~~~~~
street_lamps.cpp:63:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |             scanf("%d%d",&a,&b);
      |             ~~~~~^~~~~~~~~~~~~~
street_lamps.cpp:71:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |             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...