Submission #163982

#TimeUsernameProblemLanguageResultExecution timeMemory
163982Leonardo_PaesStreet Lamps (APIO19_street_lamps)C++17
60 / 100
1138 ms35092 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 3e5+10;

int n, q;

string initial;

vector<int> toggles;

vector<int> events[maxn];

string query[maxn];

int aa[maxn], bb[maxn];

bool subtask_1(){
    return n<=100 and q<=100;
}

bool subtask_2(){
    bool ok = true;

    for(int i=1; i<=q; i++){
        if(query[i][0]=='q' and bb[i]-aa[i]!=1) ok = false;
    }

    return ok;
}

int tree[4*maxn];

void build(int node, int l, int r){
    if(l==r){
        if((int)(initial[l]-'0') == 1) tree[node] = 0;
        else tree[node] = 0x3f3f3f3f;
        return;
    }

    int mid = (l+r) >> 1;

    build(2*node, l, mid);
    build(2*node+1, mid+1, r);

    tree[node] = max(tree[2*node], tree[2*node+1]);
}

void update(int node, int l, int r, int pos, int val){
    if(l==r){
        tree[node] = val;
        return;
    }

    int mid = (l+r) >> 1;

    if(pos<=mid) update(2*node, l, mid, pos, val);
    else update(2*node+1, mid+1, r, pos, val);

    tree[node] = max(tree[2*node], tree[2*node+1]);
}

int queryy(int node, int tl, int tr, int l, int r){
    if(tl > r or tr < l) return 0;
    if(tl >= l and tr <= r) return tree[node];

    int mid = (tl+tr) >> 1;

    return max(queryy(2*node, tl, mid, l, r), queryy(2*node+1, mid+1, tr, l, r));
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);

    cin >> n >> q;

    initial.resize(n+2);

    for(int i=1; i<=n; i++){
        cin >> initial[i];
        if(initial[i]=='1') events[i].push_back(0);
    }

    for(int i=1; i<=q; i++){
        cin >> query[i];
        if(query[i][0] == 'q') cin >> aa[i] >> bb[i];
        else cin >> aa[i];
    }

    if(subtask_1()){
        toggles.push_back(0);

        for(int t=1; t<=q; t++){
            string op = query[t];

            if(op[0] == 'q'){
                int a = aa[t], b = bb[t];

                string now = initial;

                int ans = 0;

                for(int i=0; i<toggles.size(); i++){
                    if(now[toggles[i]]=='0') now[toggles[i]] = '1';
                    else now[toggles[i]] = '0';

                    bool ok = true;

                    for(int j=a; j<b; j++) if(now[j] == '0') ok = false;

                    if(ok) ans++;
                }

                cout << ans << endl;

                toggles.push_back(0);
            }
            else{
                int i = aa[t];

                toggles.push_back(i);
            }
        }
    }
    else if(subtask_2()){
        for(int t=1; t<=q; t++){
            string op = query[t];

            if(op[0] == 'q'){
                int a = aa[t], b = bb[t];

                int ans = 0;

                for(int i=0; i<events[a].size(); i++){
                    if(i%2){
                        ans += events[a][i] - events[a][i-1];
                    }
                }

                if(events[a].size()%2) ans += t - events[a].back();

                cout << ans << endl;
            }
            else{
                int i = aa[t];

                events[i].push_back(t);
            }
        }
    }
    else{
        build(1, 1, n);

        for(int t=1; t<=q; t++){
            string op = query[t];

            if(op[0] == 'q'){
                int a = aa[t], b = bb[t];

                int ans = queryy(1, 1, n, a, b-1);

                if(ans == 0x3f3f3f3f) cout << 0 << endl;
                else cout << t-ans << endl;
            }
            else{
                int i = aa[t];

                update(1, 1, n, i, t);
            }
        }
    }

    return 0;
}

Compilation message (stderr)

street_lamps.cpp: In function 'int main()':
street_lamps.cpp:104:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<toggles.size(); i++){
                              ~^~~~~~~~~~~~~~~
street_lamps.cpp:135:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i=0; i<events[a].size(); i++){
                              ~^~~~~~~~~~~~~~~~~
street_lamps.cpp:131:32: warning: unused variable 'b' [-Wunused-variable]
                 int a = aa[t], b = bb[t];
                                ^
#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...