Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define double long double
- namespace FFT {
- const int maxf = 1 << 17;
- struct cp {
- double x, y;
- cp(double x = 0, double y = 0) : x(x), y(y) {}
- cp operator + (const cp& rhs) const {
- return cp(x + rhs.x, y + rhs.y);
- }
- cp operator - (const cp& rhs) const {
- return cp(x - rhs.x, y - rhs.y);
- }
- cp operator * (const cp& rhs) const {
- return cp(x * rhs.x - y * rhs.y, x * rhs.y + y * rhs.x);
- }
- cp operator !() const {
- return cp(x, -y);
- }
- } rts[maxf + 1];
- cp fa[maxf], fb[maxf];
- cp fc[maxf], fd[maxf];
- int bitrev[maxf];
- void fftinit() {
- int k = 0; while ((1 << k) < maxf) k++;
- bitrev[0] = 0;
- for (int i = 1; i < maxf; i++) {
- bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << k - 1);
- }
- double PI = acos((double) -1.0);
- rts[0] = rts[maxf] = cp(1, 0);
- for (int i = 1; i + i <= maxf; i++) {
- rts[i] = cp(cos(i * 2 * PI / maxf), sin(i * 2 * PI / maxf));
- }
- for (int i = maxf / 2 + 1; i < maxf; i++) {
- rts[i] = !rts[maxf - i];
- }
- }
- void dft(cp a[], int n, int sign) {
- static int isinit;
- if (!isinit) {
- isinit = 1;
- fftinit();
- }
- int d = 0; while ((1 << d) * n != maxf) d++;
- for (int i = 0; i < n; i++) {
- if (i < (bitrev[i] >> d)) {
- swap(a[i], a[bitrev[i] >> d]);
- }
- }
- for (int len = 2; len <= n; len <<= 1) {
- int delta = maxf / len * sign;
- for (int i = 0; i < n; i += len) {
- cp *x = a + i,*y = a + i + (len >> 1), *w = sign > 0 ? rts : rts + maxf;
- for (int k = 0; k + k < len; k++) {
- cp z = *y * *w;
- *y = *x - z, *x = *x + z;
- x++, y++, w += delta;
- }
- }
- }
- if (sign < 0) {
- for (int i = 0; i < n; i++) {
- a[i].x /= n;
- a[i].y /= n;
- }
- }
- }
- void multiply(int a[], int b[], int na, int nb, long long c[], int dup = 0) {
- int n = na + nb - 1; while (n != (n & -n)) n += n & -n;
- for (int i = 0; i < n; i++) fa[i] = fb[i] = cp();
- for (int i = 0; i < na; i++) fa[i] = cp(a[i]);
- for (int i = 0; i < nb; i++) fb[i] = cp(b[i]);
- dft(fa, n, 1);
- if (dup) {
- for (int i = 0; i < n; i++) fb[i] = fa[i];
- }
- else {
- dft(fb, n, 1);
- }
- for (int i = 0; i < n; i++) fa[i] = fa[i] * fb[i];
- dft(fa, n, -1);
- for (int i = 0; i < n; i++) c[i] = (long long) floor(fa[i].x + 0.5);
- }
- void multiply(int a[], int b[], int na, int nb, int c[], int mod = (int) 1e9 + 7, int dup = 0) {
- int n = na + nb - 1;
- while (n != (n & -n)) n += n & -n;
- for (int i = 0; i < n; i++) fa[i] = fb[i] = cp();
- static const int magic = 15;
- for (int i = 0; i < na; i++) fa[i] = cp(a[i] >> magic, a[i] & (1 << magic) - 1);
- for (int i = 0; i < nb; i++) fb[i] = cp(b[i] >> magic, b[i] & (1 << magic) - 1);
- dft(fa, n, 1);
- if (dup) {
- for (int i = 0; i < n; i++) fb[i] = fa[i];
- }
- else {
- dft(fb, n, 1);
- }
- for (int i = 0; i < n; i++) {
- int j = (n - i) % n;
- cp x = fa[i] + !fa[j];
- cp y = fb[i] + !fb[j];
- cp z = !fa[j] - fa[i];
- cp t = !fb[j] - fb[i];
- fc[i] = (x * t + y * z) * cp(0, 0.25);
- fd[i] = x * y * cp(0, 0.25) + z * t * cp(-0.25, 0);
- }
- dft(fc, n, -1), dft(fd, n, -1);
- for (int i = 0; i < n; i++) {
- long long u = ((long long) floor(fc[i].x + 0.5)) % mod;
- long long v = ((long long) floor(fd[i].x + 0.5)) % mod;
- long long w = ((long long) floor(fd[i].y + 0.5)) % mod;
- c[i] = ((u << magic) + v + (w << magic + magic)) % mod;
- }
- }
- vector<int> multiply(vector<int> a, vector<int> b, int mod = (int) 1e9 + 7) {
- static int fa[maxf], fb[maxf], fc[maxf];
- int na = a.size(), nb = b.size();
- for (int i = 0; i < na; i++) fa[i] = a[i];
- for (int i = 0; i < nb; i++) fb[i] = b[i];
- multiply(fa, fb, na, nb, fc, mod, a == b);
- int k = na + nb - 1;
- vector<int> res(k);
- for (int i = 0; i < k; i++) res[i] = fc[i];
- return res;
- }
- int fpow(int a, int k, int p) {
- if (!k) return 1;
- int res = a, t = a; k--;
- while (k) {
- if (k & 1) res = (long long) res * t % p;
- t = (long long) t * t % p;
- k >>= 1;
- }
- return res;
- }
- vector<int> invert(vector<int> a, int n, int mod){
- assert(a[0] != 0);
- vector<int> x(1, fpow(a[0], mod - 2, mod));
- while (x.size() < n) {
- vector<int> tmp(a.begin(), a.begin() + min(a.size(), 2 * x.size()));
- vector<int> nx = multiply(multiply(x, x, mod), tmp, mod);
- x.resize(2 * x.size());
- for (int i = 0; i < x.size(); i++) {
- x[i] += x[i];
- x[i] -= nx[i];
- if (x[i] < 0) x[i] += mod;
- if (x[i] >= mod) x[i] -= mod;
- }
- }
- x.resize(n);
- return x;
- }
- pair<vector<int>, vector<int> > divmod(vector<int> a, vector<int> b, int mod) {
- int n = a.size(), m = b.size();
- if (n < m) {
- return make_pair(vector<int>(), a);
- }
- reverse(a.begin(), a.end());
- reverse(b.begin(), b.end());
- vector<int> rb = invert(b, n - m + 1, mod);
- vector<int> d = multiply(a, rb, mod);
- reverse(a.begin(), a.end());
- reverse(b.begin(), b.end());
- while (d.size() > n - m + 1) d.pop_back();
- reverse(d.begin(), d.end());
- vector<int> r = multiply(d, b, mod);
- while (r.size() >= m) r.pop_back();
- for (int i = 0; i < m; i++) {
- r[i] = a[i] - r[i];
- if (r[i] < 0) r[i] += mod;
- }
- return make_pair(d, r);
- }
- vector<int> chirpz_transform(vector<int> a, int z, int k, int mod) {
- int n = a.size();
- vector<int> x;
- vector<int> y;
- int iz = fpow(z, mod - 2, mod);
- for (int i = 0; i < n; i++) {
- x.push_back((long long) a[i] * fpow(z, (long long) i * i, mod) % mod);
- }
- for (int i = 1 - n; i < k; i++) {
- y.push_back(fpow(iz, (long long) i * i, mod));
- }
- vector<int> r = FFT::multiply(x, y, mod);
- vector<int> res(k);
- for (int i = 0; i < k; i++) {
- res[i] = (long long) r[i + n - 1] * fpow(z, (long long) i * i, mod) % mod;
- }
- return res;
- }
- }
- #undef double
- struct Dinitz {
- struct Edges {
- int u, v;
- ll cap;
- Edges() : u(), v(), cap() {}
- Edges(int _u, int _v, ll _cap) : u(_u), v(_v), cap(_cap) {}
- };
- vector<vector<int>> g;
- vector<Edges> ed;
- vector<int> dist;
- vector<int> id;
- int S, T;
- int n;
- Dinitz() : ed(), n(), S(), T() {}
- Dinitz(int _n, int _S, int _T) {
- n = _n; S = _S; T = _T;
- g.resize(n);
- dist.resize(n);
- id.resize(n);
- for(int i = 0; i < n; i++) g[i].clear();
- ed = vector<Edges>();
- }
- void addEdge(int u, int v, ll cap) {
- g[u].pb((int)ed.size());
- ed.pb(Edges(u, v, cap));
- g[v].pb((int)ed.size());
- ed.pb(Edges(v, u, 0));
- }
- bool bfs() {
- for(int i = 0; i < n; i++) dist[i] = n + 5;
- queue<int> q;
- q.push(S); dist[S] = 0;
- while(!q.empty()) {
- int u = q.front(); q.pop();
- for(int i : g[u]) {
- Edges e = ed[i];
- if(!e.cap) continue;
- if(dist[e.v] <= dist[u] + 1) continue;
- dist[e.v] = dist[u] + 1;
- q.push(e.v);
- }
- }
- return dist[T] < n + 5;
- }
- ll dfs(int u, ll flow) {
- if(u == T || flow == 0) return flow;
- ll ans = 0;
- for(int &i = id[u]; i < (int)g[u].size(); i++) {
- Edges e = ed[g[u][i]];
- if(!e.cap) continue;
- if(dist[e.v] != dist[u] + 1) continue;
- ll f = dfs(e.v, min(flow, e.cap));
- flow -= f;
- ans += f;
- ed[g[u][i]].cap -= f;
- ed[g[u][i] ^ 1].cap += f;
- if(flow == 0) return ans;
- }
- return ans;
- }
- ll Flow() {
- ll ans = 0;
- while(bfs()) {
- for(int i = 0; i < n; i++) id[i] = 0;
- ans += dfs(S, INF * INF);
- }
- return ans;
- }
- };
- vector<int> z_function(string s) {
- int n = (int) s.length();
- vector<int> z(n);
- for (int i = 1, l = 0, r = 0; i < n; ++i) {
- if (i <= r)
- z[i] = min (r - i + 1, z[i - l]);
- while (i + z[i] < n && s[z[i]] == s[i + z[i]])
- ++z[i];
- if (i + z[i] - 1 > r)
- l = i, r = i + z[i] - 1;
- }
- return z;
- }
- struct LiChaoTree {
- int n;
- struct Line {
- ll a = 0, b = INF * INF;
- Line(ll _a = 0, ll _b = 0) : a(_a), b(_b) {}
- };
- vector<Line> Node;
- LiChaoTree(int _n = 0) {
- n = _n;
- Node.resize(4 * n + 7);
- }
- private:
- ll f(Line u, ll x) {return u.a * x + u.b;}
- void AddLine(Line u, int L, int R, int id) {
- int mid = (L + R) >> 1;
- bool left = f(u, L) < f(Node[id], L);
- bool m = f(u, mid) < f(Node[id], mid);
- if(m) swap(u, Node[id]);
- if(L == R) return;
- if(m != left) AddLine(u, L, mid, id << 1);
- else AddLine(u, mid + 1, R, id << 1 | 1);
- }
- ll Get(int L, int R, int x, int id) {
- if(L > x || R < x) return INF * INF;
- int mid = (L + R) >> 1;
- ll ans = f(Node[id], x);
- if(L == R) return ans;
- if(x <= mid) minimize(ans, Get(L, mid, x, id << 1));
- else minimize(ans, Get(mid + 1, R, x, id << 1 | 1));
- return ans;
- }
- public:
- void addLine(ll a, ll b) {
- AddLine(Line(a, b), 1, n, 1);
- }
- ll get(int x) {
- return Get(1, n, x, 1);
- }
- };
- namespace NTT {
- const int mod = MOD;
- const int maxf = (1 << 19);
- int rts[maxf + 1];
- int bitrev[maxf];
- int iv[maxf + 1];
- int fpow(int a, int k) {
- if (!k) return 1;
- int res = a, tmp = a;
- k--;
- while (k) {
- if (k & 1) {
- res = (long long) res * tmp % mod;
- }
- tmp = (long long) tmp * tmp % mod;
- k >>= 1;
- }
- return res;
- }
- int prt() {
- vector<int> dvs;
- for (int i = 2; i * i < mod; i++) {
- if ((mod - 1) % i) continue;
- dvs.push_back(i);
- if (i * i != mod - 1) dvs.push_back((mod - 1) / i);
- }
- for (int i = 2; i < mod; i++) {
- int flag = 1;
- for (int j = 0; j < dvs.size(); j++) {
- if (fpow(i, dvs[j]) == 1) {
- flag = 0;
- break;
- }
- }
- if (flag) return i;
- }
- assert(0);
- return -1;
- }
- void NTT() {
- int k = 0; while ((1 << k) < maxf) k++;
- bitrev[0] = 0;
- for (int i = 1; i < maxf; i++) {
- bitrev[i] = bitrev[i >> 1] >> 1 | ((i & 1) << k - 1);
- }
- int pw = fpow(prt(), (mod - 1) / maxf);
- rts[0] = 1;
- for (int i = 1; i <= maxf; i++) {
- rts[i] = (long long) rts[i - 1] * pw % mod;
- }
- for (int i = 1; i <= maxf; i <<= 1) {
- iv[i] = fpow(i, mod - 2);
- }
- }
- void dft(int a[], int n, int sign) {
- int d = 0; while ((1 << d) * n != maxf) d++;
- for (int i = 0; i < n; i++) {
- if (i < (bitrev[i] >> d)) {
- swap(a[i], a[bitrev[i] >> d]);
- }
- }
- for (int len = 2; len <= n; len <<= 1) {
- int delta = maxf / len * sign;
- for (int i = 0; i < n; i += len) {
- int *w = sign > 0 ? rts : rts + maxf;
- for (int k = 0; k + k < len; k++) {
- int &a1 = a[i + k + (len >> 1)], &a2 = a[i + k];
- int t = (long long) *w * a1 % mod;
- a1 = a2 - t;
- a2 = a2 + t;
- a1 += a1 < 0 ? mod : 0;
- a2 -= a2 >= mod ? mod : 0;
- w += delta;
- }
- }
- }
- if (sign < 0) {
- int in = iv[n];
- for (int i = 0; i < n; i++) {
- a[i] = (long long) a[i] * in % mod;
- }
- }
- }
- void multiply(int a[], int b[], int na, int nb, int c[]) {
- static int fa[maxf], fb[maxf];
- int n = na + nb - 1; while (n != (n & -n)) n += n & -n;
- for (int i = 0; i < n; i++) fa[i] = fb[i] = 0;
- for (int i = 0; i < na; i++) fa[i] = a[i];
- for (int i = 0; i < nb; i++) fb[i] = b[i];
- dft(fa, n, 1), dft(fb, n, 1);
- for (int i = 0; i < n; i++) fa[i] = (long long) fa[i] * fb[i] % mod;
- dft(fa, n, -1);
- for (int i = 0; i < n; i++) c[i] = fa[i];
- }
- vector<int> multiply(vector<int> a, vector<int> b) {
- NTT();
- static int fa[maxf], fb[maxf], fc[maxf];
- int na = a.size(), nb = b.size();
- for (int i = 0; i < na; i++) fa[i] = a[i];
- for (int i = 0; i < nb; i++) fb[i] = b[i];
- multiply(fa, fb, na, nb, fc);
- int k = na + nb - 1;
- vector<int> res(k);
- for (int i = 0; i < k; i++) res[i] = fc[i];
- return res;
- }
- };
- struct SGTBeats {
- const ll inf = 1e18;
- int n, n0;
- ll max_v[4 * N], smax_v[4 * N], max_c[4 * N];
- ll min_v[4 * N], smin_v[4 * N], min_c[4 * N];
- ll sum[4 * N];
- ll len[4 * N], ladd[4 * N], lval[4 * N];
- void update_node_max(int k, ll x) {
- sum[k] += (x - max_v[k]) * max_c[k];
- if (max_v[k] == min_v[k]) {
- max_v[k] = min_v[k] = x;
- } else if (max_v[k] == smin_v[k]) {
- max_v[k] = smin_v[k] = x;
- } else {
- max_v[k] = x;
- }
- if (lval[k] != inf && x < lval[k]) {
- lval[k] = x;
- }
- }
- void update_node_min(int k, ll x) {
- sum[k] += (x - min_v[k]) * min_c[k];
- if (max_v[k] == min_v[k]) {
- max_v[k] = min_v[k] = x;
- } else if (smax_v[k] == min_v[k]) {
- min_v[k] = smax_v[k] = x;
- } else {
- min_v[k] = x;
- }
- if (lval[k] != inf && lval[k] < x) {
- lval[k] = x;
- }
- }
- void push(int k) {
- if (n0 - 1 <= k) return;
- if (lval[k] != inf) {
- updateall(2 * k + 1, lval[k]);
- updateall(2 * k + 2, lval[k]);
- lval[k] = inf;
- return;
- }
- if (ladd[k] != 0) {
- addall(2 * k + 1, ladd[k]);
- addall(2 * k + 2, ladd[k]);
- ladd[k] = 0;
- }
- if (max_v[k] < max_v[2 * k + 1]) {
- update_node_max(2 * k + 1, max_v[k]);
- }
- if (min_v[2 * k + 1] < min_v[k]) {
- update_node_min(2 * k + 1, min_v[k]);
- }
- if (max_v[k] < max_v[2 * k + 2]) {
- update_node_max(2 * k + 2, max_v[k]);
- }
- if (min_v[2 * k + 2] < min_v[k]) {
- update_node_min(2 * k + 2, min_v[k]);
- }
- }
- void update(int k) {
- sum[k] = sum[2 * k + 1] + sum[2 * k + 2];
- if (max_v[2 * k + 1] < max_v[2 * k + 2]) {
- max_v[k] = max_v[2 * k + 2];
- max_c[k] = max_c[2 * k + 2];
- smax_v[k] = max(max_v[2 * k + 1], smax_v[2 * k + 2]);
- } else if (max_v[2 * k + 1] > max_v[2 * k + 2]) {
- max_v[k] = max_v[2 * k + 1];
- max_c[k] = max_c[2 * k + 1];
- smax_v[k] = max(smax_v[2 * k + 1], max_v[2 * k + 2]);
- } else {
- max_v[k] = max_v[2 * k + 1];
- max_c[k] = max_c[2 * k + 1] + max_c[2 * k + 2];
- smax_v[k] = max(smax_v[2 * k + 1], smax_v[2 * k + 2]);
- }
- if (min_v[2 * k + 1] < min_v[2 * k + 2]) {
- min_v[k] = min_v[2 * k + 1];
- min_c[k] = min_c[2 * k + 1];
- smin_v[k] = min(smin_v[2 * k + 1], min_v[2 * k + 2]);
- } else if (min_v[2 * k + 1] > min_v[2 * k + 2]) {
- min_v[k] = min_v[2 * k + 2];
- min_c[k] = min_c[2 * k + 2];
- smin_v[k] = min(min_v[2 * k + 1], smin_v[2 * k + 2]);
- } else {
- min_v[k] = min_v[2 * k + 1];
- min_c[k] = min_c[2 * k + 1] + min_c[2 * k + 2];
- smin_v[k] = min(smin_v[2 * k + 1], smin_v[2 * k + 2]);
- }
- }
- void _update_min(ll x, int a, int b, int k, int l, int r) {
- if (b <= l || r <= a || max_v[k] <= x) {
- return;
- }
- if (a <= l && r <= b && smax_v[k] < x) {
- update_node_max(k, x);
- return;
- }
- push(k);
- _update_min(x, a, b, 2 * k + 1, l, (l + r) / 2);
- _update_min(x, a, b, 2 * k + 2, (l + r) / 2, r);
- update(k);
- }
- void _update_max(ll x, int a, int b, int k, int l, int r) {
- if (b <= l || r <= a || x <= min_v[k]) {
- return;
- }
- if (a <= l && r <= b && x < smin_v[k]) {
- update_node_min(k, x);
- return;
- }
- push(k);
- _update_max(x, a, b, 2 * k + 1, l, (l + r) / 2);
- _update_max(x, a, b, 2 * k + 2, (l + r) / 2, r);
- update(k);
- }
- void addall(int k, ll x) {
- max_v[k] += x;
- if (smax_v[k] != -inf) smax_v[k] += x;
- min_v[k] += x;
- if (smin_v[k] != inf) smin_v[k] += x;
- sum[k] += len[k] * x;
- if (lval[k] != inf) {
- lval[k] += x;
- } else {
- ladd[k] += x;
- }
- }
- void updateall(int k, ll x) {
- max_v[k] = x; smax_v[k] = -inf;
- min_v[k] = x; smin_v[k] = inf;
- max_c[k] = min_c[k] = len[k];
- sum[k] = x * len[k];
- lval[k] = x; ladd[k] = 0;
- }
- void _add_val(ll x, int a, int b, int k, int l, int r) {
- if (b <= l || r <= a) {
- return;
- }
- if (a <= l && r <= b) {
- addall(k, x);
- return;
- }
- push(k);
- _add_val(x, a, b, 2 * k + 1, l, (l + r) / 2);
- _add_val(x, a, b, 2 * k + 2, (l + r) / 2, r);
- update(k);
- }
- void _update_val(ll x, int a, int b, int k, int l, int r) {
- if (b <= l || r <= a) {
- return;
- }
- if (a <= l && r <= b) {
- updateall(k, x);
- return;
- }
- push(k);
- _update_val(x, a, b, 2 * k + 1, l, (l + r) / 2);
- _update_val(x, a, b, 2 * k + 2, (l + r) / 2, r);
- update(k);
- }
- ll _query_max(int a, int b, int k, int l, int r) {
- if (b <= l || r <= a) {
- return -inf;
- }
- if (a <= l && r <= b) {
- return max_v[k];
- }
- push(k);
- ll lv = _query_max(a, b, 2 * k + 1, l, (l + r) / 2);
- ll rv = _query_max(a, b, 2 * k + 2, (l + r) / 2, r);
- return max(lv, rv);
- }
- ll _query_min(int a, int b, int k, int l, int r) {
- if (b <= l || r <= a) {
- return inf;
- }
- if (a <= l && r <= b) {
- return min_v[k];
- }
- push(k);
- ll lv = _query_min(a, b, 2 * k + 1, l, (l + r) / 2);
- ll rv = _query_min(a, b, 2 * k + 2, (l + r) / 2, r);
- return min(lv, rv);
- }
- ll _query_sum(int a, int b, int k, int l, int r) {
- if (b <= l || r <= a) {
- return 0;
- }
- if (a <= l && r <= b) {
- return sum[k];
- }
- push(k);
- ll lv = _query_sum(a, b, 2 * k + 1, l, (l + r) / 2);
- ll rv = _query_sum(a, b, 2 * k + 2, (l + r) / 2, r);
- return lv + rv;
- }
- SGTBeats(int n) {
- SGTBeats(n, nullptr);
- }
- SGTBeats(int n, ll *a) : n(n) {
- n0 = 1;
- while (n0 < n) n0 <<= 1;
- for (int i = 0; i < 2 * n0; ++i) ladd[i] = 0, lval[i] = inf;
- len[0] = n0;
- for (int i = 0; i < n0 - 1; ++i) len[2 * i + 1] = len[2 * i + 2] = (len[i] >> 1);
- for (int i = 0; i < n; ++i) {
- max_v[n0 - 1 + i] = min_v[n0 - 1 + i] = sum[n0 - 1 + i] = (a != nullptr ? a[i] : 0);
- smax_v[n0 - 1 + i] = -inf;
- smin_v[n0 - 1 + i] = inf;
- max_c[n0 - 1 + i] = min_c[n0 - 1 + i] = 1;
- }
- for (int i = n; i < n0; ++i) {
- max_v[n0 - 1 + i] = smax_v[n0 - 1 + i] = -inf;
- min_v[n0 - 1 + i] = smin_v[n0 - 1 + i] = inf;
- max_c[n0 - 1 + i] = min_c[n0 - 1 + i] = 0;
- }
- for (int i = n0 - 2; i >= 0; i--) {
- update(i);
- }
- }
- // all queries are performed on [l, r) segment
- // range minimize query
- void update_min(int a, int b, ll x) {
- _update_min(x, a, b, 0, 0, n0);
- }
- // range maximize query
- void update_max(int a, int b, ll x) {
- _update_max(x, a, b, 0, 0, n0);
- }
- // range add query
- void add_val(int a, int b, ll x) {
- _add_val(x, a, b, 0, 0, n0);
- }
- // range update query
- void update_val(int a, int b, ll x) {
- _update_val(x, a, b, 0, 0, n0);
- }
- // range minimum query
- ll query_max(int a, int b) {
- return _query_max(a, b, 0, 0, n0);
- }
- // range maximum query
- ll query_min(int a, int b) {
- return _query_min(a, b, 0, 0, n0);
- }
- // range sum query
- ll query_sum(int a, int b) {
- return _query_sum(a, b, 0, 0, n0);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement