Submission #494284

#TimeUsernameProblemLanguageResultExecution timeMemory
494284teeeStreet Lamps (APIO19_street_lamps)C++14
0 / 100
144 ms116884 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct seg{
    struct node{
        int l,r;
        int val;
    };
    vector<node> tree;
    void init(){
        tree.push_back({0,0,0});
        tree.push_back({0,0,0});
    }
    void insert(int n,int s,int e,int t,int diff){
        tree[n].val+=diff;
        int mid=s+e>>1;
        if(diff<=mid){
            if(!tree[n].l){
                tree[n].l=tree.size();
                tree.push_back({0,0,diff});
                return;
            }insert(tree[n].l,s,mid,t,diff);
        }else{
            if(!tree[n].r){
                tree[n].r=tree.size();
                tree.push_back({0,0,diff});
                return;
            }insert(tree[n].r,mid+1,e,t,diff);
        }
    }
    int query(int n,int s,int e,int l,int r){
        if(!n||!tree[n].val||e<l||r<s)return 0;
        int mid=s+e>>1;
        return query(tree[n].l,s,mid,l,r)+query(tree[n].r,mid+1,e,l,r);
    }
};
seg tree[1048564];
int N;
void update(int n,int s,int e,int t,int k,int diff){
    if(e<t||t<s)return;
    tree[n].insert(1,1,N,k,diff);
    if(s==e)return;
    int mid=s+e>>1;
    update(n<<1,s,mid,t,k,diff);
    update(n<<1|1,mid+1,e,t,k,diff);
}
int query(int n,int s,int e,int l,int r,int ll,int rr){
    if(e<l||r<s)return 0;
    if(l<=s&&e<=r){
        int t=tree[n].query(1,1,N,ll,rr);
        return t;
    }
    int mid=s+e>>1;
    return query(n<<1,s,mid,l,r,ll,rr)+query(n<<1|1,mid+1,e,l,r,ll,rr);
}map<int,pair<int,int>> t;
string arr;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n,q,b,c;
    cin>>n>>q>>arr;N=n;
    for(int i=1;i<1048564;i++)tree[i].init();
    arr='0'+arr+'0';
    int w=0;
    for(int i=1;i<arr.length();i++){
        if(arr[i-1]=='1'&&arr[i]=='0'){
            t.insert({w,{i-1,0}});
        }if(arr[i-1]=='0'&&arr[i])w=i;
    }
    string a;
    for(int i=1;i<=q;i++){
        cin>>a>>b;
        if(a[0]=='q'){
            cin>>c;c--;
            int res=0;
            auto e=t.upper_bound(b);
            if(e!=t.begin()&&c<=prev(e)->second.first)res+=i-prev(e)->second.second;
            res+=query(1,1,n,1,b,c,n);
            cout<<res<<'\n';
        }else{
            if(arr[b]=='1'){
                auto e=prev(t.upper_bound(b));
                update(1,1,n,e->first,e->second.first,i-e->second.second);
                if(e->first!=b){
                    t.insert({e->first,{b-1,i}});
                }if(e->second.first!=b){
                    t.insert({b+1,{e->second.first,i}});
                }t.erase(e);arr[b]='0';
            }else{
                if(arr[b-1]=='1'&&arr[b+1]=='1'){
                    auto e=t.lower_bound(b);
                    update(1,1,n,e->first,e->second.first,i-e->second.second);
                    int E=e->second.first;
                    auto e2=prev(e);
                    update(1,1,n,e2->first,e2->second.first,i-e2->second.second);
                    int S=e2->first;
                    t.erase(e);t.erase(e2);
                    t.insert({S,{E,i}});
                }else if(arr[b-1]=='1'){
                    auto e2=prev(t.lower_bound(b));
                    update(1,1,n,e2->first,e2->second.first,i-e2->second.second);
                    int S=e2->first;
                    t.erase(e2);
                    t.insert({S,{b,i}});
                }else if(arr[b+1]=='1'){
                    auto e=t.lower_bound(b);
                    update(1,1,n,e->first,e->second.first,i-e->second.second);
                    int E=e->second.first;
                    t.erase(e);
                    t.insert({b,{E,i}});
                }else{
                    t.insert({b,{b,i}});
                }arr[b]='1';
            }
        }
    }
}

Compilation message (stderr)

street_lamps.cpp: In member function 'void seg::insert(int, int, int, int, int)':
street_lamps.cpp:18:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   18 |         int mid=s+e>>1;
      |                 ~^~
street_lamps.cpp: In member function 'int seg::query(int, int, int, int, int)':
street_lamps.cpp:35:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   35 |         int mid=s+e>>1;
      |                 ~^~
street_lamps.cpp: In function 'void update(int, int, int, int, int, int)':
street_lamps.cpp:45:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   45 |     int mid=s+e>>1;
      |             ~^~
street_lamps.cpp: In function 'int query(int, int, int, int, int, int, int)':
street_lamps.cpp:55:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   55 |     int mid=s+e>>1;
      |             ~^~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:68:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for(int i=1;i<arr.length();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...