Submission #599690

#TimeUsernameProblemLanguageResultExecution timeMemory
599690MilosMilutinovicStreet Lamps (APIO19_street_lamps)C++14
0 / 100
1973 ms290472 KiB
/**
 *    author:  wxhtzdy
 *    created: 19.07.2022 20:06:36
**/
#include <bits/stdc++.h>

using namespace std;

const int N = (int) 3e5 + 5;
const int M = 60 * N; 

int root[N], ls[M], rs[M], tsz;
long long st[M];

void modify(int& c, int l, int r, int ll, int rr, int v) {
  if (!c) {
    c = ++tsz;
  }
  if (l > r || ll > rr || l > rr || r < ll) {
    return;
  }
  if (ll <= l && r <= rr) {
    st[c] += v;
    return;
  }
  int mid = l + r >> 1;
  modify(ls[c], l, mid, ll, rr, v);
  modify(rs[c], mid + 1, r, ll, rr, v);      
}

void modify(int x, int l, int r, int v) {
  for (x++; x < N; x += x & -x) {
    modify(root[x], 0, N - 1, l, r, v);
  }
}

void modify(int l, int r, int ll, int rr, int v) {
  modify(l, ll, rr, v);
  modify(r + 1, ll, rr, -v);
}

long long get(int c, int l, int r, int i) {
  if (!c) {
    return 0;
  }
  if (l == r) {
    return st[c];
  }
  int mid = l + r >> 1;
  if (i <= mid) {
    return st[c] + get(ls[c], l, mid, i);
  } else {
    return st[c] + get(rs[c], mid + 1, r, i);
  }
}

int get(int x, int y) {
  long long res = 0;
  for (x++; x > 0; x -= x & -x) {
    res += get(root[x], 0, N - 1, y);
  }
  return res;
}  

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n, q;
  cin >> n >> q;
  string s;
  cin >> s;
  set<pair<int, int>> segs;
  for (int i = 0; i < n; i++) {
    if (s[i] == '0') {
      continue;
    }
    int ptr = i;
    while (ptr + 1 < n && s[ptr + 1] == '1') {
      ptr += 1;
    }                  
    segs.emplace(i, ptr);
    i = ptr;
  }
  vector<bool> on(N);
  auto Add = [&](int i, int t) {
    pair<int, int> new_seg = {i, i}; 
    {
      auto it = segs.lower_bound({i + 1, -1});
      if (it != segs.begin()) {
        --it;
        auto p = *it;
        if (p.second == i - 1) {
          segs.erase(it);
          new_seg.first = p.first;
        }
      }
    }
    {
      auto it = segs.lower_bound({i + 1, -1});
      if (it != segs.end()) {
        auto p = *it;
        if (p.first == i + 1) {
          segs.erase(it);
          new_seg.second = p.second;
        }
      }
    }
    modify(new_seg.first, i, i, new_seg.second, -t);
    segs.emplace(new_seg);
    on[i] = true;
  };
  auto Remove = [&](int i, int t) {
    auto it = prev(segs.lower_bound({i + 1, -1}));
    auto p = *it;
    modify(p.first, i, i, p.second, +t);
    segs.erase(it);
    if (p.first < i) {
      segs.emplace(p.first, i - 1);
    }
    if (i < p.second) {
      segs.emplace(i + 1, p.second);
    }
    on[i] = false;
  };      
  for (int t = 1; t <= q; t++) {
    string op;
    cin >> op;
    if (op == "toggle") {
      int i;
      cin >> i;
      --i;     
      if (!on[i]) {
        Add(i, t);
      } else {
        Remove(i, t);
      }
    } else {
      int l, r;
      cin >> l >> r;
      --l; --r;
      int ans = get(l, r - 1);
      auto it = segs.lower_bound({l + 1, -1});
      if (it != segs.begin()) {
        --it;
        if (it->first <= l && it->second >= r - 1) {
          ans += t;
        }
      } 
      cout << ans << '\n';
    }
  }
  return 0;
}        

Compilation message (stderr)

street_lamps.cpp: In function 'void modify(int&, int, int, int, int, int)':
street_lamps.cpp:26:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |   int mid = l + r >> 1;
      |             ~~^~~
street_lamps.cpp: In function 'long long int get(int, int, int, int)':
street_lamps.cpp:49:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |   int mid = l + r >> 1;
      |             ~~^~~
#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...