This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub kmyk/competitive-programming-library
#include "utils/mo_algorithm.hpp"
#pragma once #include <algorithm> #include <cmath> #include <numeric> #include <tuple> #include <utility> #include <vector> // struct mo_struct { // typedef int64_t value_type; // typedef int64_t result_type; // void add_right(int nr, value_type x_r) { // } // void add_left(int nl, value_type x_nl) { // } // void remove_right(int nr, value_type x_nr) { // } // void remove_left(int nl, value_type x_l) { // } // result_type query() { // return 0; // } // }; template <class Mo> std::vector<typename Mo::result_type> run_mo_algorithm(Mo mo, const std::vector<typename Mo::value_type>& values, const std::vector<std::pair<int, int> >& queries) { int n = values.size(); int m = queries.size(); // sort queries int sq_n = std::sqrt(n); std::vector<int> order(m); std::iota(ALL(order), 0); std::sort(ALL(order), [&](int i, int j) { int l_i, r_i; std::tie(l_i, r_i) = queries[i]; int l_j, r_j; std::tie(l_j, r_j) = queries[j]; return std::make_pair(l_i / sq_n, r_i) < std::make_pair(l_j / sq_n, r_j); }); // compute queries std::vector<typename Mo::result_type> ans(m); int l = 0; int r = 0; for (int j : order) { int nl, nr; std::tie(nl, nr) = queries[j]; for (; r < nr; ++ r) mo.add_right(r + 1, values[r]); for (; nl < l; -- l) mo.add_left(l - 1, values[l - 1]); for (; nr < r; -- r) mo.remove_right(r - 1, values[r - 1]); for (; l < nl; ++ l) mo.remove_left(l + 1, values[l]); ans[j] = mo.query(); } return ans; }
#line 2 "utils/mo_algorithm.hpp" #include <algorithm> #include <cmath> #include <numeric> #include <tuple> #include <utility> #include <vector> // struct mo_struct { // typedef int64_t value_type; // typedef int64_t result_type; // void add_right(int nr, value_type x_r) { // } // void add_left(int nl, value_type x_nl) { // } // void remove_right(int nr, value_type x_nr) { // } // void remove_left(int nl, value_type x_l) { // } // result_type query() { // return 0; // } // }; template <class Mo> std::vector<typename Mo::result_type> run_mo_algorithm(Mo mo, const std::vector<typename Mo::value_type>& values, const std::vector<std::pair<int, int> >& queries) { int n = values.size(); int m = queries.size(); // sort queries int sq_n = std::sqrt(n); std::vector<int> order(m); std::iota(ALL(order), 0); std::sort(ALL(order), [&](int i, int j) { int l_i, r_i; std::tie(l_i, r_i) = queries[i]; int l_j, r_j; std::tie(l_j, r_j) = queries[j]; return std::make_pair(l_i / sq_n, r_i) < std::make_pair(l_j / sq_n, r_j); }); // compute queries std::vector<typename Mo::result_type> ans(m); int l = 0; int r = 0; for (int j : order) { int nl, nr; std::tie(nl, nr) = queries[j]; for (; r < nr; ++ r) mo.add_right(r + 1, values[r]); for (; nl < l; -- l) mo.add_left(l - 1, values[l - 1]); for (; nr < r; -- r) mo.remove_right(r - 1, values[r - 1]); for (; l < nl; ++ l) mo.remove_left(l + 1, values[l]); ans[j] = mo.query(); } return ans; }