Submission #1172447

#TimeUsernameProblemLanguageResultExecution timeMemory
1172447fryingducStreet Lamps (APIO19_street_lamps)C++20
100 / 100
2991 ms163048 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 3e5 + 5;
int n, q;
int a[maxn];
char qo[maxn];
int ql[maxn], qr[maxn];

struct info {
  int l, r, x, y;
  
  info() {}
  
  info(int l, int r, int x, int y) : l(l), r(r), x(x), y(y) {}
};
vector<info> vec;

int szx;
vector<int> cpx;
vector<vector<int>> srg;
vector<vector<pair<long long, int>>> bit;
vector<array<int, 3>> que[maxn];

void update(int x, int y, int val, int dlt) {
  for (int i = x; i <= szx; i += i & (-i)) {
    int j = lower_bound(srg[i].begin(), srg[i].end(), n - y + 1) - srg[i].begin() + 1;
    for (; j < (int)bit[i].size(); j += j & (-j)) {
      bit[i][j].first += dlt * val;
      bit[i][j].second += dlt;
    }
  }
}

pair<int, int> get(int u, int v) {
  pair<long long, int> ans = make_pair(0, 0);
  for (int i = u; i > 0; i -= i & (-i)) {
    int j = upper_bound(srg[i].begin(), srg[i].end(), n - v + 1) - srg[i].begin();
    for (; j > 0; j -= j & (-j)) {
      ans.first += bit[i][j].first;
      ans.second += bit[i][j].second;
    }
  }
  return ans;
}

void solve() {
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) {
    char c; cin >> c;
    a[i] = c - '0';
  }
  for (int i = 1; i <= q; ++i) {
    string op; cin >> op;
    qo[i] = op[0];
    if (op[0] == 't') {
      cin >> ql[i];
    } else {
      cin >> ql[i] >> qr[i];
    }
  }
  int prv = 0;
  set<array<int, 3>> s;
  set<int> zr;
  zr.insert(0);
  zr.insert(n + 1);
  for (int i = 1; i <= n + 1; ++i) {
    if (!a[i]) {
      zr.insert(i);
      s.insert({prv, i, 0});
      prv = i;
    }
  }
  for (int i = 1; i <= q; ++i) {
    if (qo[i] == 't') {
      int p = ql[i];
      int nr = *zr.upper_bound(p);
      int nl = *(--zr.lower_bound(p));
      if (!a[p]) {
        auto it = s.lower_bound({p, -1, -1});
        vec.emplace_back((*it)[0], (*it)[1], (*it)[2], i);
        it = s.erase(it), it--;
        vec.emplace_back((*it)[0], (*it)[1], (*it)[2], i);
        s.erase(it);
        s.insert({nl, nr, i});
        zr.erase(p);
      } else {
        auto it = --s.upper_bound({p, -1, -1});
        vec.emplace_back((*it)[0], (*it)[1], (*it)[2], i);
        s.erase(it);
        s.insert({nl, p, i});
        s.insert({p, nr, i});
        zr.insert(p);
      }
      a[p] ^= 1;
    }
  }
  for (auto vl : s) {
    vec.emplace_back(vl[0], vl[1], vl[2], q + 1);
  }
  for (auto [l, r, x, y] : vec) {
    cpx.push_back(l);
  }
  sort(cpx.begin(), cpx.end());
  cpx.erase(unique(cpx.begin(), cpx.end()), cpx.end());
  szx = (int)cpx.size();
  bit.resize(szx + 1);
  srg.resize(szx + 1);
  for (auto [l, r, x, y] : vec) {
    l = lower_bound(cpx.begin(), cpx.end(), l) - cpx.begin() + 1;
    for (int i = l; i <= szx; i += i & (-i)) {
      srg[i].push_back(n - r + 1);
    }
  } 
  for (int i = 1; i <= szx; ++i) {
    sort(srg[i].begin(), srg[i].end());
    srg[i].erase(unique(srg[i].begin(), srg[i].end()), srg[i].end());
    bit[i].resize((int)srg[i].size() + 2);
  }
  for (auto [l, r, x, y] : vec) {
    que[x].push_back({l, r, 1});
    que[y].push_back({l, r, -1});
  }
  for (int i = 0; i <= q; ++i) {
    if (i > 0 and qo[i] == 'q') {
      int u = ql[i] - 1, v = qr[i];
      u = upper_bound(cpx.begin(), cpx.end(), u) - cpx.begin();
      pair<long long, int> cur = get(u, v);
//      debug(i, u, qr[i], cur);
      cout << 1ll * i * cur.second - cur.first << '\n';
    }
    for (auto [u, v, dlt] : que[i]) {
      u = lower_bound(cpx.begin(), cpx.end(), u) - cpx.begin() + 1;
//      debug(i, u, v, dlt);
      update(u, v, i, dlt);
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#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...