Submission #551637

#TimeUsernameProblemLanguageResultExecution timeMemory
551637cig32Street Lamps (APIO19_street_lamps)C++17
20 / 100
5101 ms524288 KiB
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace std;
#define int long long
const int MAXN = 3e5 + 10;
const int MOD = 998244353;
#define ll __int128
using namespace __gnu_pbds;
mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y) {
  int u = uniform_int_distribution<int>(x, y)(rng); return u;
}
ll read() { int x; cin >> x; return (ll)x; }
long long bm(long long b, long long p) {
  if(p==0) return 1 % MOD;
  long long r = bm(b, p >> 1);
  if(p&1) return (((r*r) % MOD) * b) % MOD;
  return (r*r) % MOD;
}
long long inv(long long b) { 
  return bm(b, MOD-2);
}
long long f[MAXN];
long long nCr(int n, int r) { 
  long long ans = f[n]; ans *= inv(f[r]); ans %= MOD;
  ans *= inv(f[n-r]); ans %= MOD; return ans;
}
void precomp() { for(int i=0; i<MAXN; i++) f[i] = (i == 0 ? 1 % MOD : (f[i-1] * i) % MOD); }
int fastlog(int x) {
  return (x == 0 ? -1 : 32 - __builtin_clz(x) - 1);
}
void gay(int i) { cout << "Case #" << i << ": "; }
char s[MAXN]; int n, q, t;
int sum[1001][1001];
set<pair<pair<int, int>, int> > ranges;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef tree<pair<pair<int,int>, int>, null_type, less<pair<pair<int,int>, int> >, rb_tree_tag, tree_order_statistics_node_update> ernie_tree;
struct multibit { // O(N log^2 N)
  ernie_tree ost[MAXN];
  map<pair<int,int>,queue<int> >mp;
  int id = 0;
  void add(int x, int y, int cnt) { // O(cnt * log^2 N)
    if(cnt < 0) {
      erase(x, y, -cnt); return;
    }
    int stox = x;
    for(int i=0; i<cnt; i++) {
      x = stox;
      id++;
      mp[{x, y}].push(id);
      for(;x<MAXN;x+=x&-x) {
        ost[x].insert({{y, x}, id});
      }
    }
  }
  void erase(int x, int y, int cnt) { // O(cnt * log^2 N)
    if(cnt < 0) {
      add(x, y, -cnt); return;
    }
    int stox = x;
    for(int i=0; i<cnt; i++) {
      x = stox;
      if(mp[{x, y}].empty()) return;
      int ono = mp[{x, y}].front(); mp[{x, y}].pop();
      for(;x<MAXN;x+=x&-x) {
        ost[x].erase({{y, x}, ono});
      }
    }
  }
  int sum(int x, int y) {
    int s = 0;
    for(;x;x-=x&-x) {
      s += ost[x].order_of_key({{y, 1e7}, 1e7});
    }
    return s;
  }
};
multibit cnt, ended;//sum[19];
void insert_segment(int x, int y) {
  ranges.insert({{x, y}, t});
  cnt.add(x, y, 1);
  sum[x][y] += t;
}
void delete_segment(int x, int y) {
  auto it = ranges.lower_bound({{x, y}, 0});
  ended.add(x, y, t - sum[x][y]);
  cnt.erase(x, y, 1);
  sum[x][y] = 0;
  ranges.erase(it);
}
void solve(int tc) {
  t = 0;
  cin >> n >> q;
  for(int i=1; i<=n; i++) cin >> s[i];
  for(int i=1; i<=n; i++) {
    if(s[i] == '1') {
      int j = i;
      while(j + 1 <= n && s[j+1] == '1') ++j;
      insert_segment(i, j);
      i = j + 1;
    }
  }
  while(q--) {
    ++t;
    string str;
    cin >> str;
    if(str == "toggle") {
      int i;
      cin >> i;
      s[i] = (s[i] == '1' ? '0' : '1');
      if(s[i] == '1') {
        int l = i;
        for(pair<pair<int, int>, int> x: ranges) {
          if(x.first.second == i - 1) {
            int sto = x.first.first;
            l = sto;
            delete_segment(sto, i - 1);
            insert_segment(sto, i);
            break;
          }
        }
        if(l == i) {
          insert_segment(l, i);
        }
        for(pair<pair<int, int>, int> x: ranges) {
          if(x.first.first == i + 1) {
            int sto = x.first.second;
            delete_segment(l, i);
            delete_segment(i + 1, sto);
            insert_segment(l, sto);
          }
        }
      }
      else {
        for(pair<pair<int, int>, int> x: ranges) {
          if(x.first.first <= i && i <= x.first.second) {
            int ff = x.first.first, ss = x.first.second;
            delete_segment(ff, ss);
            if(ff < i) insert_segment(ff, i - 1);
            if(i < ss) insert_segment(i + 1, ss);
            break;
          }
        }
      }
    }
    else {
      int a, b;
      cin >> a >> b;
      b--;
      int ans = 0;
      ans += ended.sum(a, 300000) - ended.sum(a, b - 1);
      int tcnt = 0, tsum = 0;
      tcnt = cnt.sum(a, 300000) - cnt.sum(a, b - 1);
      for(int i=1; i<=a; i++) {
        for(int j=b; j<=100; j++) {
          tsum += sum[i][j];
        }
      }
      if(tcnt == 0) {
        cout << ans << '\n'; continue;
      }
      ans += t * tcnt - tsum;
      cout << ans << '\n';
    }
  }
}
int32_t main() {
  precomp();
  //ios::sync_with_stdio(0); cin.tie(0);
  int t = 1; //cin >> t;
  for(int i=1; i<=t; i++) solve(i);
} 
// I don't know geometry.
#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...