Submission #522406

#TimeUsernameProblemLanguageResultExecution timeMemory
522406BalintRStreet Lamps (APIO19_street_lamps)C++17
60 / 100
5009 ms21176 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize "Ofast"

#define pb push_back
inline constexpr int lg2(int x){return 32 - __builtin_clz(x);}

const int MDIGITS = 7, PW10[MDIGITS] = {0, 10, 100, 1000, 10000, 100000, 1000000};
const int IO_SZ = 6 << 20;
char _buf[IO_SZ], *_ii = _buf, *_oi = _buf;
template <typename T> inline void scan(T &x){for(x=*_ii++-'0'; *_ii++>='0'; x=x*10+_ii[-1]-'0');}
template <typename T> inline void print(T x){int dg=0; while(dg<MDIGITS && PW10[dg]<=x) dg++; for(char *i=_oi+dg-1; i>=_oi; --i, x/=10) *i=x%10+'0'; _oi+=dg;}

// type 1 - increase [l, n-r) by v
// type 2 - query [l, n-r), v is extra
struct Event {
    int type, l, r, v;
};
vector<Event> events;

const int MN = 3e5 + 5;
int n, q;
char *arr;
int bit1[MN];
int lvl[MN];

int xArr[MN*2], yArr[MN*2], vArr[MN*2], ai;

int bit1Lb(int x){
    if(x <= 0) return -1;
    int i = 0;
    for(int pw = 1 << lg2(n); pw > 0; pw >>= 1) if(i + pw <= n && bit1[i + pw] < x) x -= bit1[i += pw];
    return i;
}

int main(){
    fread(_buf, 1, IO_SZ, stdin);
    scan(n); scan(q);
    arr = _ii; _ii += n+1;
    for(int i = 0; i < n; ++i) if(!(arr[i] -= '0')) for(int j = i+1; j <= n; j += j & -j) bit1[j]++;

    events.reserve(n*2);
    for (int i = 1; i <= q; ++i) {
        bool type = *_ii == 't';
        _ii += type ? 7 : 6;

        if(type){
            int a; scan(a); a--;
            int cur = 0;
            for(int j = a+1; j; j -= j & -j) cur += bit1[j];
            int l = bit1Lb(cur - !arr[a]) + 1;
            int r = bit1Lb(cur+1);

            if(arr[a]){
                int prv = lvl[r];
                events.pb({1, l, n-r, i-prv});

                arr[a] = 0;
                lvl[a] = lvl[r] = i;
                for(int j = a+1; j <= n; j += j & -j) bit1[j]++;
            }
            else {
                if(l < a){
                    int prv = lvl[a];
                    events.pb({1, l, n-a, i-prv});
                }
                if(r > a+1){
                    int prv = lvl[r];
                    events.pb({1, a+1, n-r, i-prv});
                }

                arr[a] = 1;
                lvl[r] = i;
                for(int j = a+1; j <= n; j += j & -j) bit1[j]--;
            }
        }
        else {
            int l, r;
            scan(l); scan(r);
            l--; r--;
            int qRes = 0;
            for(int j = l+1; j; j -= j & -j) qRes += bit1[j];
            int mr = bit1Lb(qRes - !arr[l] + 1);
            events.pb({2, l, n-r, mr >= r ? i-lvl[mr] : 0});
        }
    }

    for(Event event : events){
        if(event.type == 1){
            xArr[ai] = event.l;
            yArr[ai] = event.r;
            vArr[ai] = event.v;
            ai++;
        }
        else {
            int x = event.l, y = event.r, res = event.v;
            for (int i = 0; i < ai; i++) {
                if(xArr[i] <= x && yArr[i] <= y) res += vArr[i];
            }
            print(res); *_oi++ = '\n';
        }
    }
    fwrite(_buf, 1, _oi-_buf, stdout);
}

Compilation message (stderr)

street_lamps.cpp: In function 'int main()':
street_lamps.cpp:37:10: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |     fread(_buf, 1, IO_SZ, stdin);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...