Submission #1327936

#TimeUsernameProblemLanguageResultExecution timeMemory
1327936DeltaStruct가로등 (APIO19_street_lamps)C++20
100 / 100
1476 ms170924 KiB
#include <bits/stdc++.h>
using namespace std;

struct segtree_t {
  int n; vector<long long> segtree; vector<int> A;
  segtree_t() : n(0),segtree(),A() {}
  segtree_t(segtree_t x,segtree_t y) : n(0),segtree(),A() {
    merge(x.A.begin(),x.A.end(),y.A.begin(),y.A.end(),back_inserter(A));
    A.erase(unique(A.begin(),A.end()),A.end());
    n = A.size(),segtree.assign(2*n,0);
  }
  void build(){
    sort(A.begin(),A.end()),A.erase(unique(A.begin(),A.end()),A.end());
    n = A.size(),segtree.assign(2*n,0);
  }
  void push(int x){
    A.emplace_back(x);
  }
  void add(int l,int r,int a){
    int ll = lower_bound(A.begin(),A.end(),l)-A.begin();
    int rr = lower_bound(A.begin(),A.end(),r)-A.begin();
    for (ll+=n,rr+=n;ll < rr;ll>>=1,rr>>=1){
      if (ll&1) segtree[ll++] += a;
      if (rr&1) segtree[--rr] += a;
    }
  }
  long long get(int x){
    int ret = 0;
    for (int l(lower_bound(A.begin(),A.end(),x)-A.begin()+n);l;l>>=1) ret += segtree[l];
    return ret;
  }
};

int main(){
  ios::sync_with_stdio(false),cin.tie(0);
  int n,q; cin >> n >> q; string s; cin >> s; char flip = '0'^'1';
  set<pair<int,int>> S;
  vector<segtree_t> segtree(2*n);
  vector<pair<int,int>> Q(q);
  for (auto& [a,b]:Q){
    string s; cin >> s; b = -1;
    if (s=="toggle") (cin >> a),--a;
    else (cin>>a>>b),--a,--b,segtree[n+a].push(b);
  }
  for (int i(0);i < n;++i) segtree[n+i].build();
  for (int i(n-1);i;--i) segtree[i] = segtree_t(segtree[i<<1],segtree[i<<1|1]);
  for (int i(0);i < n;++i) if (s[i]=='1'){
    int x = i; while(i+1<n&&s[i+1]=='1') ++i;
    S.emplace(i,x);
    //cout << x << ' ' << i << ' ' << x << ' ' << i+1 << ' ' << q << endl;
    for (int l(n+x),r(n+i+1);l < r;l>>=1,r>>=1){
      if (l&1) segtree[l++].add(x,i+2,q);
      if (r&1) segtree[--r].add(x,i+2,q);
    }
  }
  for (int i(0);auto& [a,b]:Q){
    if (b==-1){
      auto it = S.lower_bound(make_pair(a,0));
      if (s[a]=='1'){
        for (int l(n+it->second),r(n+a+1);l < r;l>>=1,r>>=1){
          if (l&1) segtree[l++].add(a+1,it->first+2,-(q-i-1));
          if (r&1) segtree[--r].add(a+1,it->first+2,-(q-i-1));
        }
        if (a!=it->second) S.emplace(a-1,it->second);
        if (a!=it->first) S.emplace(it->first,a+1);
        S.erase(it);
      } else {
        int l = a,r = a;
        if (it!=S.end()&&it->second==a+1) r = it->first,it=S.erase(it);
        if (it!=S.begin()&&prev(it)->first==a-1) l = prev(it)->second,S.erase(prev(it));
        S.emplace_hint(it,make_pair(r,l));
        for (int ll(n+l),rr(n+a+1);ll < rr;ll>>=1,rr>>=1){
          if (ll&1) segtree[ll++].add(a+1,r+2,q-i-1);
          if (rr&1) segtree[--rr].add(a+1,r+2,q-i-1);
        }
      }
      s[a] ^= flip;
    } else {
      long long res = 0;
      for (int l(n+a);l;l>>=1) res += segtree[l].get(b);
      auto it = S.lower_bound(make_pair(a,0));
      if (it!=S.end()&&it->first+1>=b&&it->second<=a) res -= q-i-1;
      cout << res << '\n';
    }
    ++i;
  }
}
#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...