Algorithm-Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub UScuber/Algorithm-Library

:heavy_check_mark: others/mo.hpp

Verified with

Code

ll value = 0;
struct Mo {
  struct Query { int l,r,b,idx; };
  vector<ll> res;
  vector<Query> d;
  int width, n, q;
  Mo(int n, int q) : n(n), q(q), width(max(1.0, n/max(1.0, sqrt(q*2.0/3)))), res(q), d(q){}
  void insert(const int &l, const int &r){
    assert(0 <= l && l <= r && r <= n);
    static int idx = 0;
    d[idx] = { l, r, l / width, idx };
    idx++;
  }
  void build(){
    sort(d.begin(), d.end(), [&](const Query &a, const Query &b){
      if(a.b != b.b) return a.b < b.b;
      return (a.b & 1) ? a.r > b.r : a.r < b.r;
    });
    int nl = 0, nr = 0;
    for(const auto &v : d){
      while(nl > v.l) add_left(--nl);
      while(nr < v.r) add_right(nr++);
      while(nl < v.l) del_left(nl++);
      while(nr > v.r) del_right(--nr);
      res[v.idx] = value;
    }
  }
  void add_left(int p);
  void add_right(int p);
  void del_left(int p);
  void del_right(int p);
};
#line 1 "others/mo.hpp"
ll value = 0;
struct Mo {
  struct Query { int l,r,b,idx; };
  vector<ll> res;
  vector<Query> d;
  int width, n, q;
  Mo(int n, int q) : n(n), q(q), width(max(1.0, n/max(1.0, sqrt(q*2.0/3)))), res(q), d(q){}
  void insert(const int &l, const int &r){
    assert(0 <= l && l <= r && r <= n);
    static int idx = 0;
    d[idx] = { l, r, l / width, idx };
    idx++;
  }
  void build(){
    sort(d.begin(), d.end(), [&](const Query &a, const Query &b){
      if(a.b != b.b) return a.b < b.b;
      return (a.b & 1) ? a.r > b.r : a.r < b.r;
    });
    int nl = 0, nr = 0;
    for(const auto &v : d){
      while(nl > v.l) add_left(--nl);
      while(nr < v.r) add_right(nr++);
      while(nl < v.l) del_left(nl++);
      while(nr > v.r) del_right(--nr);
      res[v.idx] = value;
    }
  }
  void add_left(int p);
  void add_right(int p);
  void del_left(int p);
  void del_right(int p);
};
Back to top page