Submission #1345927

#TimeUsernameProblemLanguageResultExecution timeMemory
1345927Robert_juniorStreet Lamps (APIO19_street_lamps)C++20
0 / 100
5090 ms28016 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define pb push_back
#define ins insert
#define pii pair<int, int>
const int N = 3e5 + 100, LG = 20;
bool a[N];
int f[N], ans[N]; 
void add(int idx, int val){
    for(; idx < N; idx |= (idx + 1)){
        f[idx] += val;
    }
}
int get(int r){
    int res = 0;
    for(; r >= 0; r = (r & (r + 1)) - 1){
        res += f[r];
    }
    return res;
}
int get(int l, int r){
    return get(r) - get(l - 1);
}
template <typename T> class OfflineBIT2D {
  private:
	const int n;
	vector<vector<int>> vals;
	vector<vector<T>> bit;

	int ind(const vector<int> &v, int x) {
		return upper_bound(begin(v), end(v), x) - begin(v) - 1;
	}

  public:
	OfflineBIT2D(int n, vector<array<int, 2>> &todo) : n(n), vals(n + 1), bit(n + 1) {
		sort(begin(todo), end(todo),
		     [](const array<int, 2> &a, const array<int, 2> &b) -> bool {
			     return a[1] < b[1];
		     });

		for (int i = 1; i <= n; i++) { vals[i].push_back(0); }
		for (auto [r, c] : todo) {
			r++, c++;
			for (; r <= n; r += r & -r) {
				if (vals[r].back() != c) { vals[r].push_back(c); }
			}
		}
		for (int i = 1; i <= n; i++) { bit[i].resize(vals[i].size()); }
	}

	void add(int r, int c, T val) {
		r++, c++;
		for (; r <= n; r += r & -r) {
			int i = ind(vals[r], c);
			for (; i < bit[r].size(); i += i & -i) { bit[r][i] += val; }
		}
	}

	T rect_sum(int r, int c) {
		r++, c++;
		T sum = 0;
		for (; r > 0; r -= r & -r) {
			int i = ind(vals[r], c);
			for (; i > 0; i -= i & -i) { sum += bit[r][i]; }
		}
		return sum;
	}

	T rect_sum(int r1, int c1, int r2, int c2) {
		return rect_sum(r2, c2) - rect_sum(r2, c1 - 1) - rect_sum(r1 - 1, c2) +
		       rect_sum(r1 - 1, c1 - 1);
	}
}; 
bool cmp(array<int, 4>a, array<int, 4>b){
    if(a[1] != b[1]) return a[1] < b[1];
    return a[0] < b[0];
}
void solve(){
    int n, q;
    cin>>n>>q;
    for(int i = 1; i <= n; i++){
        char c;
        cin>>c;
        a[i] = c - '0';
        add(i, a[i]);
    }
    vector<array<int, 4>>V;
    for(int l = 1; l <= n; l++){
        //cout<<a[l]<<' ';
        if(!a[l]) continue; 
        int r = l;
        while(r + 1 <= n && a[r + 1] == 1) r++;
        //cout<<l<<' '<<r<<'\n';
        V.pb({1, 0, l, r});
        l = r;
    }
    for(int tt = 1; tt <= q; tt++){
        string s;
        cin>>s; 
        if(s == "toggle"){
            int i;
            cin>>i;
            int l = 1, r = i - 1, L = i, R = i; 
            while(l <= r){
                int m = (l + r) / 2;
                if(get(m, i - 1) == (i - m)){
                    L = m;
                    r = m - 1;
                }
                else{
                    l = m + 1;
                }
            }
            l = i + 1, r = n;
            while(l <= r){
                int m = (l + r) / 2;
                if(get(i + 1, m) == m - i){
                    l = m + 1;
                    R = m;
                }
                else{
                    r = m - 1;
                }
            }
            if(!a[i]){
                a[i] = 1;
                add(i, 1);
                if(L != i){
                    V.pb({2, tt - 1, L, i - 1});
                }
                if(R != i){
                    V.pb({2, tt - 1, i + 1, R});
                }
                V.pb({1, tt, L, R});
            }
            else{
                a[i] = 0;
                add(i, -1);
                V.pb({2, tt - 1, L, R});
                if(L != i){
                    V.pb({1, tt, L, i - 1});
                }
                if(R != i){
                    V.pb({1, tt, i + 1, R});
                }
            }
            ans[i] = -1;
        }
        else{
            int l, r;
            cin>>l>>r;
            V.pb({3, tt - 1, l, r - 1});
        } 
    }
    vector<array<int, 2>>upd;
    sort(all(V), cmp);
    for(auto it : V){
        //cout<<it[0]<<' '<<it[1]<<' '<<it[2]<<' '<<it[3]<<'\n';
        if(it[0] <= 2) upd.pb({it[2], it[3]});
    }
    OfflineBIT2D<int>Fen(n + 1, upd);
    map<pair<int, int>, int>mp;
    multiset<array<int, 3>>st;
    for(auto it : V){
        if(it[0] == 1){
            mp[{it[2], it[3]}] = it[1];
            st.ins({it[1], it[2], it[3]});
        }
        else if(it[0] == 2){ 
            st.erase({it[1], it[2], it[3]});
            Fen.add(it[2], it[3], it[1] - mp[{it[2], it[3]}] + 1);
        }
        else{
            ans[it[1] + 1] = Fen.rect_sum(1, it[3], it[2], n);
            for(auto it2 : st){
                if(it2[1] <= it[2] && it[3] <= it2[2]) ans[it[1] + 1] += (it[1] - it2[0] + 1);
            }
        }
    }
    for(int i = 1; i <= q; i++){
        if(ans[i] != -1){
            cout<<ans[i]<<'\n';
        }
    }
}
main(){
    ios_base :: sync_with_stdio(false); 
    cin.tie(nullptr);
    //freopen("friendcross.in", "r", stdin);
    //freopen("friendcross.out", "w", stdout);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
}

Compilation message (stderr)

street_lamps.cpp:192:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  192 | main(){
      | ^~~~
#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...