Submission #729168

#TimeUsernameProblemLanguageResultExecution timeMemory
7291681075508020060209tcStreet Lamps (APIO19_street_lamps)C++14
20 / 100
1025 ms123404 KiB

#include<bits/stdc++.h>

using namespace std;
#define int long long
int lowbit(int x){return x&-x;}

int bit[300005];
void upd(int pl,int val){
while(pl<=300000){
    bit[pl]+=val;
    pl+=lowbit(pl);
}
}
int qsum(int l,int r){
int ret=0;
while(r){
    ret+=bit[r];
    r-=lowbit(r);
}
l--;
while(l){
    ret-=bit[l];
    l-=lowbit(l);
}
return ret;
}



int n;int Q;

string tss;

int ar[300005];
string typ[300005];int qa[300005];int qb[300005];
int ps[300005];
int ans[300005];

void build(int l,int r){
for(int i=l;i<=r;i++){
    if(typ[i]=="toggle"){
        upd(qa[i],1);
    }
}
}
void undo(int l,int r){
for(int i=l;i<=r;i++){
    if(typ[i]=="toggle"){
        upd(qa[i],-1);
    }
}
}

void split(vector<int>&lv,vector<int>&rv,vector<int>v){
for(int i=0;i<v.size();i++){
    int id=v[i];
    int a=qa[id];int b=qb[id];
    b--;
    int len=b-a+1;
    if(qsum(a,b)==len){
        lv.push_back(id);
    }else{
        rv.push_back(id);
    }
}
}

void totalbs(vector<int>qid,int l,int r){
//cout<<l<<" "<<r<<endl;
if(l==r){
    for(int i=0;i<qid.size();i++){
        ans[qid[i]]=l;
    }
return;
}

int mi=(l+r)/2;
build(l,mi);
vector<int>lv;vector<int>rv;
split(lv,rv,qid);
totalbs(rv,mi+1,r);
undo(l,mi);
totalbs(lv,l,mi);
return;
}


signed main(){
cin>>n>>Q;
cin>>tss;tss="*"+tss;
for(int i=1;i<=n;i++){
    ar[i]=tss[i]-'0';
}
vector<int>qid;

for(int i=1;i<=Q;i++){
    cin>>typ[i];
    if(typ[i][0]=='q'){
        qid.push_back(i);
        cin>>qa[i]>>qb[i];
    }else{
        cin>>qa[i];
    }
}

for(int i=1;i<=n;i++){
    upd(i,ar[i]);
}

totalbs(qid,0,Q+1);


for(int i=1;i<=Q;i++){
    if(typ[i][0]=='q'){
        cout<<max(0ll,i-ans[i])<<endl;
    }
}



}


Compilation message (stderr)

street_lamps.cpp: In function 'void split(std::vector<long long int>&, std::vector<long long int>&, std::vector<long long int>)':
street_lamps.cpp:56:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 | for(int i=0;i<v.size();i++){
      |             ~^~~~~~~~~
street_lamps.cpp: In function 'void totalbs(std::vector<long long int>, long long int, long long int)':
street_lamps.cpp:72:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |     for(int i=0;i<qid.size();i++){
      |                 ~^~~~~~~~~~~
#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...