Submission #1044923

#TimeUsernameProblemLanguageResultExecution timeMemory
1044923vjudge1Street Lamps (APIO19_street_lamps)C++17
60 / 100
153 ms22776 KiB
#pragma GCC optimize("unroll-loops,Ofast,O3")
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define spc << " " <<
#define endl "\n"
#define all(x) x.begin(), x.end()
#define int long long
#define ii pair<long long,int>
#define vi vector<int>
#define vii vector<ii>
#define st first
#define nd second
#define mid (l+r)/2
#define inf 1e15
#define MOD 1000000007
#define MX 300005
using namespace std;


int n,q;
struct segtree{
    vi tree;
    segtree(){
        tree.resize(2*MX,0);
    }
    void update(int v, int l, int r, int pos, int val){
        if(l>r) return;
        if(l==r){
            tree[v]=val;
            return;
        }
        if(pos<=mid){
            update(v+1, l, mid, pos, val);
        }
        else{
            update(v+2*(mid-l+1), mid+1, r, pos, val);
        }
        tree[v]=max(tree[v+1], tree[v+2*(mid-l+1)]);
    }
    int query(int v, int l, int r, int ql, int qr){
        if(l>qr || r<ql) return 0;
        if(l>=ql && r<=qr) return tree[v];
        return max(query(v+1, l, mid, ql, qr), query(v+2*(mid-l+1), mid+1, r, ql, qr));
    }
};

void solve(){
    cin >> n >> q;
    string s; cin >> s;
    segtree seg;
    if(n>100 || q>100){
        int tot[n+1], last[n+1], cur[n+1];
        int tim[n+1];
        for(int i=1; i<=n; i++){
            tot[i]=last[i]=tim[i]=0;
            cur[i]=s[i-1]-'0';
            if(s[i-1]=='0'){
                tim[i]=inf;
                seg.update(1, 1, n, i, inf);
            }
        }
        for(int i=1; i<=q; i++){
            cin >> s;
            if(s[0]=='t'){
                int a; cin >> a;
                if(cur[a]==0){
                    last[a]=i;
                }
                else{
                    tot[a]+=i-last[a];
                }
                cur[a]=1-cur[a];
                seg.update(1, 1, n, a, i);
            }
            else{
                int l,r; cin >> l >> r;
                int ans=tot[l];
                if(cur[l]) ans+=i-last[l];
                if(l==r-1)cout << ans << endl;
                else{
                    ans=seg.query(1, 1, n, l, r-1);
                    if(ans==inf) cout << 0 << endl;
                    else cout << i-ans << endl;
                }
            }
        }
        return;
    }
    int arr[q+1][n+1];
    for(int i=1; i<=n; i++){
        if(s[i-1]=='0') arr[1][i]=0;
        else arr[1][i]=1;
    }
    
    for(int i=1; i<=q; i++){
        string h; cin >> h;
        if(i<q) for(int j=1; j<=n; j++) arr[i+1][j]=arr[i][j];
        if(h[0]=='t'){
            int a; cin >> a;
            arr[i+1][a]=1-arr[i+1][a];
        }
        else{
            int l,r; cin >> l >> r;
            int ans=0;
            for(int j=1; j<=i; j++){
                int ok=1;
                for(int f=l; f<r; f++){
                    if(!arr[j][f]){
                        ok=0;
                        break;
                    }
                }
                if(ok){
                    ans++;
                }
            }
            cout << ans << endl;
        }
    }
}
 
 
signed main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    #ifdef Local
    freopen("in","r",stdin);
    freopen("out","w",stdout);
    #endif
 
    /*freopen("nondec.in","r",stdin);
    freopen("nondec.out","w",stdout);*/
 
    int t=1;
    //cin >> t;
    while(t--) solve();
}
#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...