제출 #1367189

#제출 시각아이디문제언어결과실행 시간메모리
1367189thewizardman가로등 (APIO19_street_lamps)C++20
60 / 100
500 ms35404 KiB
#include <bits/stdc++.h>
using namespace std;

const int inf = 1e9;

int n, q;
vector<pair<int, int>> st[600005];
string s;

vector<pair<int, int>> mg(const vector<pair<int, int>> &l, const vector<pair<int, int>> &r) {
  vector<pair<int, int>> ret;
  for (int i = 0, j = 0; i < l.size() && j < r.size(); ) {
    while (j < r.size() && r[j].second < l[i].first) j++;
    while (i < l.size() && l[i].second < r[j].first) i++;
    while (j < r.size() && r[j].second >= l[i].first && l[i].second >= r[j].first) {
      ret.emplace_back(max(l[i].first, r[j].first), min(l[i].second, r[j].second));
      if (l[i].second < r[i].second) i++;
      else if (l[i].second == r[i].second) i++, j++;
      else j++;
    }
  }
  return ret;
}

vector<pair<int, int>> query(int l, int r) {
  vector<pair<int, int>> ret = {{1, inf}};
  for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
    if (l&1) ret = std::move(mg(ret, st[l++]));
    if (r&1) ret = std::move(mg(ret, st[--r]));
  }
  return ret;
}

void update(int i, int t) {
  i += n;
  if (st[i].empty() || st[i].back().second != inf) {
    st[i].emplace_back(t+1, inf);
    for (i >>= 1; i >= 1; i >>= 1) {
      if (st[i<<1].empty() || st[i<<1].back().second <= t || st[i<<1|1].empty() || st[i<<1|1].back().second <= t) break;
      st[i].emplace_back(t+1, inf);
    }
  } else {
    for (; i >= 1; i >>= 1) if (!st[i].empty()) st[i].back().second = min(st[i].back().second, t);
  }
}

void dbg() {
  for (int i = 1; i < 2*n; i++) {
    cout << i << ": ";
    for (auto [l, r]: st[i]) cout << l << ' ' << r << ' ';
    cout << '\n';
  }
  cout << "===============\n";
}

int main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  cin >> n >> q >> s;
  for (int i = 0; i < n; i++) if (s[i] == '1') st[i+n].emplace_back(1, inf);
  for (int i = n-1; i >= 0; i--) st[i] = std::move(mg(st[i<<1], st[i<<1|1]));
  for (int t = 1; t <= q; t++) {
    cin >> s;
    if (s == "query") {
      int a, b; cin >> a >> b;
      a--, b--;
      auto v = std::move(query(a, b));
      int ans = 0;
      for (auto [l, r]: v) ans += min(t, r) - l + 1;
      cout << ans << '\n';
    } else {
      int u; cin >> u;
      u--;
      update(u, t);
    }
  }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…